JavaScriptを勉強し始めた頃に作成したユーティリティです。
C#ライクな文字整形機能を提供しまっす。
ずいぶん前に作ったので荒い実装です・・・
{0}とか引数で渡されるとたぶんおかしくなります。
使い方はC#のstring.Formatとほぼ同じです。
var text = String.Format("{0} {1:d2} {2:t#yyyy.MM.dd HH:mm:ss.fff}",
"引数", 5, new Date());
みたいな感じです。
Dateオブジェクトの書式指定は「t#」に続けてフォーマットを書きます。
上の例では書いていませんが、右詰フォーマットや左詰フォーマット、
16進表記フォーマットもできます。
この機能はwscjsfwに含まれているので、
良ければ見てください。
ル
var MONTH_LONG_ENG = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var MONTH_LONG_JPN = new Array("睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走");
var MONTH_LONG_JPN2 = new Array("一月", "二月", "三生", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
var MONTH_SHORT_ENG = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
var MONTH_SHORT_JPN = new Array("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月");
var WEEK_LONG_ENG = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var WEEK_LONG_JPN = new Array("日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日");
var WEEK_SHORT_ENG = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
var WEEK_SHORT_JPN = new Array("日", "月", "火", "水", "木", "金", "土");
// LocalLocation ---------------------------------------------------------------
var LocationSetting = function(){};
LocationSetting.prototype =
{
LongMonthNames : MONTH_LONG_JPN,
ShortMonthNames : MONTH_SHORT_JPN,
LongWeekNames : WEEK_LONG_JPN,
ShortWeekNames : WEEK_SHORT_JPN,
DateFormat : "yyyy/MM/dd",
DateTimeFormat : "yyyy/MM/dd HH:mm:ss"
}
var LocalLocation = new LocationSetting();
/**
* フォーマット識別子基本クラス
* カスタムフォーマットを定義する場合、
* このクラスを継承し、
* String.Formatsにオブジェクトを追加します。
*/
var BaseFormatter = function(){};
BaseFormatter.prototype =
{
/**
* フォーマットチェック用の正規表現を定義します
*/
FormatRegExpString : "^.*$",
/**
* フォーマットチェックを実施します。
* このメソッドは子クラスでオーバライドする必要はありません
*/
CheckFormat : function(format)
{
var reg = new RegExp(this.FormatRegExpString);
if(format.match(reg)) return true;
return false;
},
/**
* 指定されたフォーマット、値を受け取り
* 変換後の文字列を返却します
*/
Convert : function(format, value)
{
return value;
}
}
/**
* 自動フォーマット識別子クラス
*/
var AutoFormatter = function(){};
/**
* 自動フォーマット
*/
AutoFormatter.Convert = function(value)
{
try
{
switch(typeof value)
{
case "unknown":
return "unknown";
case "undefined":
return "undefined";
case "boolean":
return String(value);
case "string":
return value;
case "number":
return String(value);
case "function":
var ret = "(function)=>[";
for(var obj in value)
{
ret += obj + ":" + this.Convert(value[obj]) + ",";
}
ret = ret.EndWith(",") ? ret.substring(0, ret.length - 1) : ret;
ret += "]";
return ret;
case "object":
var ret = "(object)=>[";
for(var obj in value)
{
ret += obj + ":" + this.Convert(value[obj]) + ",";
}
ret = ret.EndWith(",") ? ret.substring(0, ret.length - 1) : ret;
ret += "]";
return ret;
default:
return value;
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトはフォーマッタで処理できません。");
throw ex;
}
}
/**
* 数字フォーマット識別子クラス
*/
var DigitFormatter = function(){};
DigitFormatter.prototype = new BaseFormatter();
DigitFormatter.prototype.FormatRegExpString = "^d\\d+$";
/**
* 数字フォーマット
*/
DigitFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.slice(1));
if(value.length >= len)
{
return String(value);
}
else
{
var zero = String(Math.pow(10, len)).slice(1+String(value).length);
return String(zero + String(value));
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは数字フォーマッタで処理できません。");
throw ex;
}
}
/**
* 16進数フォーマット識別子クラス
*/
var HexFormatter = function(){};
HexFormatter.prototype = new BaseFormatter();
HexFormatter.prototype.FormatRegExpString = "^[xX](\\d+)?$";
/**
* 16進数フォーマット
*/
HexFormatter.prototype.Convert = function(format, value)
{
try
{
var target = HexFormatter.HelperFunction(value);
if(format.StartWith("X"))
{
target = target.ToUpper();
}
var len = 0;
if(format.length > 1)
{
len= new Number(format.slice(1));
}
if(value.length >= len)
{
return String(target);
}
else
{
var zero = String(Math.pow(10, len)).slice(1+String(target).length);
return String(zero + String(target));
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは16進数フォーマッタで処理できません。");
throw ex;
}
}
HexFormatter.HelperFunction = function(){};
HexFormatter.HelperFunction = function(value)
{
var ret = "";
while(true)
{
var tar = value % 16;
switch(tar)
{
case 10 : ret = "a" + ret; break;
case 11 : ret = "b" + ret; break;
case 12 : ret = "c" + ret; break;
case 13 : ret = "d" + ret; break;
case 14 : ret = "e" + ret; break;
case 15 : ret = "f" + ret; break;
default : ret = String(tar) + ret;
}
if(value < 16)
break;
value = Number((value - tar) / 16);
}
return ret;
}
/**
* 右詰フォーマット識別子クラス
*/
var FillRightFormatter = function(){};
FillRightFormatter.prototype = new BaseFormatter();
FillRightFormatter.prototype.FormatRegExpString = "^r\\d+\\[.\\]$";
/**
* 右詰フォーマット
*/
FillRightFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.substring(1,format.length-3));
var fillValue = String(format.substring(format.length-2,format.length-1));
var ret = String(value);
for(i=0 ; i<len ; i++)
{
ret += fillValue;
}
// 切捨て
return ret.substring(0, len);
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは右詰フォーマッタで処理できません。");
throw ex;
}
}
/**
* 左詰フォーマット識別子クラス
*/
var FillLeftFormatter = function(){};
FillLeftFormatter.prototype = new BaseFormatter();
FillLeftFormatter.prototype.FormatRegExpString = "^l\\d+\\[.\\]$";
/**
* 左詰フォーマット
*/
FillLeftFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.substring(1,format.length-3));
var fillValue = String(format.substring(format.length-2,format.length-1));
var ret = String(value);
for(i=0 ; i<len ; i++)
{
ret = fillValue + ret;
}
// 切捨て
return ret.substring(ret.length-len, ret.length);
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは左詰フォーマッタで処理できません。");
throw ex;
}
}
/**
* 日時フォーマット識別子クラス
*/
var DateFormatter = function(){};
DateFormatter.prototype = new BaseFormatter();
DateFormatter.prototype.FormatRegExpString = "^t#.+$";
/**
* 日時フォーマット
*/
DateFormatter.prototype.Convert = function(format, value)
{
try
{
var hour = value.getHours();
var ret = String(format.slice(2));
ret = ret.replace(/f+/g, function()
{
var msFormat = "{0:r" + String(arguments[0].length) + "[0]}";
return String.Format(msFormat, value.getMilliseconds());
});
ret = ret.replace(/F+/g, function()
{
var ms = String(value.getMilliseconds());
if(ms.length>arguments[0].length)
{
return ms.substring(0, arguments[0].length);
}
else
{
return ms;
}
});
ret = ret.replace(/yyyy/g, value.getFullYear());
ret = ret.replace(/yy/g, String(value.getFullYear()).slice(2));
ret = ret.replace(/MMMM/g, LocalLocation.LongMonthNames[value.getMonth()]);
ret = ret.replace(/MMM/g, LocalLocation.ShortMonthNames[value.getMonth()]);
ret = ret.replace(/MM/g, String.Format("{0:d2}", value.getMonth()+1));
ret = ret.replace(/M/g, value.getMonth()+1);
ret = ret.replace(/dddd/g, LocalLocation.LongWeekNames[value.getDay()]);
ret = ret.replace(/ddd/g, LocalLocation.ShortWeekNames[value.getDay()]);
ret = ret.replace(/dd/g, String.Format("{0:d2}", value.getDate()));
ret = ret.replace(/d/g, value.getDate());
ret = ret.replace(/HH/g, String.Format("{0:d2}", hour));
ret = ret.replace(/H/g, hour);
ret = ret.replace(/hh/g, String.Format("{0:d2}", hour%12));
ret = ret.replace(/h/g, hour%12);
ret = ret.replace(/mm/g,String.Format("{0:d2}",value.getMinutes()));
ret = ret.replace(/m/g,value.getMinutes());
ret = ret.replace(/ss/g,String.Format("{0:d2}",value.getSeconds()));
ret = ret.replace(/s/g,value.getSeconds());
ret = ret.replace(/tt/g,(hour<12?"AM":"PM"));
ret = ret.replace(/t/g, (hour<12?"A":"P"));
return ret;
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは日時フォーマッタで処理できません。");
throw ex;
}
}
// 書式整形対応フォーマット一覧
String.Formats = new Array(
new DigitFormatter(), // 数字フォーマット
new HexFormatter(), // 16進数フォーマット
new DateFormatter(), // 日付フォーマット
new FillRightFormatter(), // 右詰フォーマット
new FillLeftFormatter() // 左詰フォーマット
);
/**
* 書式整形
*/
String.Format = function()
{
try
{
var args = [];
for(var i = 0; i < arguments.length; i++) args[i] = arguments[i];
var format = args.shift();
var reg = /\{((\d)|([1-9]\d+))(:.+?)?\}/g;
var reg2 = new RegExp(":[^\\}]+");
var argReg = new RegExp("\\{((\\d)|([1-9]\\d+))");
var ma = format.match(reg);
if(ma)
{
for(i=0;i<ma.length;i++)
{
var ma2 = ma[i].match(reg2);
var argIndex = Number(ma[i].match(argReg)[0].slice(1));
var rep = args[argIndex];
if(ma2)
{
var formatString = ma2[0].slice(1);
// 書式整形
for(j=0; j<String.Formats.length ;j++)
{
if(String.Formats[j].CheckFormat(formatString))
{
// 書式を適用
rep = String.Formats[j].Convert(formatString,
rep==null||typeof(rep)=="undefined"?"":rep);
}
}
}
else
{
// String関数で変換したものがObjectとして出力される為、削除
//rep = AutoFormatter.Convert(rep);
}
format = format.replace(ma[i], rep);
}
}
return format;
}
catch(ex)
{
throw new Error("書式整形できませんでした。\r\n" + ex.description);
}
}
以下、コード
// 月、曜日テーブル
var MONTH_LONG_ENG = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var MONTH_LONG_JPN = new Array("睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "長月", "神無月", "霜月", "師走");
var MONTH_LONG_JPN2 = new Array("一月", "二月", "三生", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
var MONTH_SHORT_ENG = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
var MONTH_SHORT_JPN = new Array("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月");
var WEEK_LONG_ENG = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var WEEK_LONG_JPN = new Array("日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日");
var WEEK_SHORT_ENG = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
var WEEK_SHORT_JPN = new Array("日", "月", "火", "水", "木", "金", "土");
// LocalLocation ---------------------------------------------------------------
var LocationSetting = function(){};
LocationSetting.prototype =
{
LongMonthNames : MONTH_LONG_JPN,
ShortMonthNames : MONTH_SHORT_JPN,
LongWeekNames : WEEK_LONG_JPN,
ShortWeekNames : WEEK_SHORT_JPN,
DateFormat : "yyyy/MM/dd",
DateTimeFormat : "yyyy/MM/dd HH:mm:ss"
}
var LocalLocation = new LocationSetting();
/**
* フォーマット識別子基本クラス
* カスタムフォーマットを定義する場合、
* このクラスを継承し、
* String.Formatsにオブジェクトを追加します。
*/
var BaseFormatter = function(){};
BaseFormatter.prototype =
{
/**
* フォーマットチェック用の正規表現を定義します
*/
FormatRegExpString : "^.*$",
/**
* フォーマットチェックを実施します。
* このメソッドは子クラスでオーバライドする必要はありません
*/
CheckFormat : function(format)
{
var reg = new RegExp(this.FormatRegExpString);
if(format.match(reg)) return true;
return false;
},
/**
* 指定されたフォーマット、値を受け取り
* 変換後の文字列を返却します
*/
Convert : function(format, value)
{
return value;
}
}
/**
* 自動フォーマット識別子クラス
*/
var AutoFormatter = function(){};
/**
* 自動フォーマット
*/
AutoFormatter.Convert = function(value)
{
try
{
switch(typeof value)
{
case "unknown":
return "unknown";
case "undefined":
return "undefined";
case "boolean":
return String(value);
case "string":
return value;
case "number":
return String(value);
case "function":
var ret = "(function)=>[";
for(var obj in value)
{
ret += obj + ":" + this.Convert(value[obj]) + ",";
}
ret = ret.EndWith(",") ? ret.substring(0, ret.length - 1) : ret;
ret += "]";
return ret;
case "object":
var ret = "(object)=>[";
for(var obj in value)
{
ret += obj + ":" + this.Convert(value[obj]) + ",";
}
ret = ret.EndWith(",") ? ret.substring(0, ret.length - 1) : ret;
ret += "]";
return ret;
default:
return value;
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトはフォーマッタで処理できません。");
throw ex;
}
}
/**
* 数字フォーマット識別子クラス
*/
var DigitFormatter = function(){};
DigitFormatter.prototype = new BaseFormatter();
DigitFormatter.prototype.FormatRegExpString = "^d\\d+$";
/**
* 数字フォーマット
*/
DigitFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.slice(1));
if(value.length >= len)
{
return String(value);
}
else
{
var zero = String(Math.pow(10, len)).slice(1+String(value).length);
return String(zero + String(value));
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは数字フォーマッタで処理できません。");
throw ex;
}
}
/**
* 16進数フォーマット識別子クラス
*/
var HexFormatter = function(){};
HexFormatter.prototype = new BaseFormatter();
HexFormatter.prototype.FormatRegExpString = "^[xX](\\d+)?$";
/**
* 16進数フォーマット
*/
HexFormatter.prototype.Convert = function(format, value)
{
try
{
var target = HexFormatter.HelperFunction(value);
if(format.StartWith("X"))
{
target = target.ToUpper();
}
var len = 0;
if(format.length > 1)
{
len= new Number(format.slice(1));
}
if(value.length >= len)
{
return String(target);
}
else
{
var zero = String(Math.pow(10, len)).slice(1+String(target).length);
return String(zero + String(target));
}
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは16進数フォーマッタで処理できません。");
throw ex;
}
}
HexFormatter.HelperFunction = function(){};
HexFormatter.HelperFunction = function(value)
{
var ret = "";
while(true)
{
var tar = value % 16;
switch(tar)
{
case 10 : ret = "a" + ret; break;
case 11 : ret = "b" + ret; break;
case 12 : ret = "c" + ret; break;
case 13 : ret = "d" + ret; break;
case 14 : ret = "e" + ret; break;
case 15 : ret = "f" + ret; break;
default : ret = String(tar) + ret;
}
if(value < 16)
break;
value = Number((value - tar) / 16);
}
return ret;
}
/**
* 右詰フォーマット識別子クラス
*/
var FillRightFormatter = function(){};
FillRightFormatter.prototype = new BaseFormatter();
FillRightFormatter.prototype.FormatRegExpString = "^r\\d+\\[.\\]$";
/**
* 右詰フォーマット
*/
FillRightFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.substring(1,format.length-3));
var fillValue = String(format.substring(format.length-2,format.length-1));
var ret = String(value);
for(i=0 ; i<len ; i++)
{
ret += fillValue;
}
// 切捨て
return ret.substring(0, len);
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは右詰フォーマッタで処理できません。");
throw ex;
}
}
/**
* 左詰フォーマット識別子クラス
*/
var FillLeftFormatter = function(){};
FillLeftFormatter.prototype = new BaseFormatter();
FillLeftFormatter.prototype.FormatRegExpString = "^l\\d+\\[.\\]$";
/**
* 左詰フォーマット
*/
FillLeftFormatter.prototype.Convert = function(format, value)
{
try
{
var len = new Number(format.substring(1,format.length-3));
var fillValue = String(format.substring(format.length-2,format.length-1));
var ret = String(value);
for(i=0 ; i<len ; i++)
{
ret = fillValue + ret;
}
// 切捨て
return ret.substring(ret.length-len, ret.length);
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは左詰フォーマッタで処理できません。");
throw ex;
}
}
/**
* 日時フォーマット識別子クラス
*/
var DateFormatter = function(){};
DateFormatter.prototype = new BaseFormatter();
DateFormatter.prototype.FormatRegExpString = "^t#.+$";
/**
* 日時フォーマット
*/
DateFormatter.prototype.Convert = function(format, value)
{
try
{
var hour = value.getHours();
var ret = String(format.slice(2));
ret = ret.replace(/f+/g, function()
{
var msFormat = "{0:r" + String(arguments[0].length) + "[0]}";
return String.Format(msFormat, value.getMilliseconds());
});
ret = ret.replace(/F+/g, function()
{
var ms = String(value.getMilliseconds());
if(ms.length>arguments[0].length)
{
return ms.substring(0, arguments[0].length);
}
else
{
return ms;
}
});
ret = ret.replace(/yyyy/g, value.getFullYear());
ret = ret.replace(/yy/g, String(value.getFullYear()).slice(2));
ret = ret.replace(/MMMM/g, LocalLocation.LongMonthNames[value.getMonth()]);
ret = ret.replace(/MMM/g, LocalLocation.ShortMonthNames[value.getMonth()]);
ret = ret.replace(/MM/g, String.Format("{0:d2}", value.getMonth()+1));
ret = ret.replace(/M/g, value.getMonth()+1);
ret = ret.replace(/dddd/g, LocalLocation.LongWeekNames[value.getDay()]);
ret = ret.replace(/ddd/g, LocalLocation.ShortWeekNames[value.getDay()]);
ret = ret.replace(/dd/g, String.Format("{0:d2}", value.getDate()));
ret = ret.replace(/d/g, value.getDate());
ret = ret.replace(/HH/g, String.Format("{0:d2}", hour));
ret = ret.replace(/H/g, hour);
ret = ret.replace(/hh/g, String.Format("{0:d2}", hour%12));
ret = ret.replace(/h/g, hour%12);
ret = ret.replace(/mm/g,String.Format("{0:d2}",value.getMinutes()));
ret = ret.replace(/m/g,value.getMinutes());
ret = ret.replace(/ss/g,String.Format("{0:d2}",value.getSeconds()));
ret = ret.replace(/s/g,value.getSeconds());
ret = ret.replace(/tt/g,(hour<12?"AM":"PM"));
ret = ret.replace(/t/g, (hour<12?"A":"P"));
return ret;
}
catch(ex)
{
if(typeof(Log)!="undefined") Log.WriteErrorSystem(ex, "オブジェクトは日時フォーマッタで処理できません。");
throw ex;
}
}
// 書式整形対応フォーマット一覧
String.Formats = new Array(
new DigitFormatter(), // 数字フォーマット
new HexFormatter(), // 16進数フォーマット
new DateFormatter(), // 日付フォーマット
new FillRightFormatter(), // 右詰フォーマット
new FillLeftFormatter() // 左詰フォーマット
);
/**
* 書式整形
*/
String.Format = function()
{
try
{
var args = [];
for(var i = 0; i < arguments.length; i++) args[i] = arguments[i];
var format = args.shift();
var reg = /\{((\d)|([1-9]\d+))(:.+?)?\}/g;
var reg2 = new RegExp(":[^\\}]+");
var argReg = new RegExp("\\{((\\d)|([1-9]\\d+))");
var ma = format.match(reg);
if(ma)
{
for(i=0;i<ma.length;i++)
{
var ma2 = ma[i].match(reg2);
var argIndex = Number(ma[i].match(argReg)[0].slice(1));
var rep = args[argIndex];
if(ma2)
{
var formatString = ma2[0].slice(1);
// 書式整形
for(j=0; j<String.Formats.length ;j++)
{
if(String.Formats[j].CheckFormat(formatString))
{
// 書式を適用
rep = String.Formats[j].Convert(formatString,
rep==null||typeof(rep)=="undefined"?"":rep);
}
}
}
else
{
// String関数で変換したものがObjectとして出力される為、削除
//rep = AutoFormatter.Convert(rep);
}
format = format.replace(ma[i], rep);
}
}
return format;
}
catch(ex)
{
throw new Error("書式整形できませんでした。\r\n" + ex.description);
}
}
2010.09.19