[1] [[XSLT]] の[[関数]] [CODE[[[文字列]] [CODE(XPathf)[format-number]] ([VAR[[[数値]]]], [VAR[文字列]], [VAR[[[修飾名]]]]?)]] [WEAK[()]] を使うと、任意の数値を任意の書式で表現したものを得ることが出来ます。 第1引数が対象の数値, 第2引数が適用する書式文字列, 第3引数が十進数書式 (decimal‐format) の名前です。 省略時は既定のものとなります。 第3引数で指定されている修飾名が [CODE(XSLTe)[[VAR[xslt:]][[decimal-format]]]] 要素で定義されていないなら[[誤り]]です。 [2] 第2引数の書式は、 [CODE(java)[java.text.[[DecimalFormat]]]] で使われているものです。 [WEAK[仕様書には Java での実装を強要するものではないとか書いていますが、一方で書式が JDK の文書参照になっているとかいう依存ぶり。]] - ''Class java.text.DecimalFormat'' : XSLT 1.0 が参照している文書 (JDK 1.1) - ''DecimalFormat (Java 2 Platform SE v1.4.1)'' : (J2SE 1.4.1) - ''DecimalFormat (Java 2 プラットフォーム SE v1.4.0)'' : (J2SE 1.4.0 日本語) ちなみに XSLT 2.0 WD ではパワーアップしたものがちゃんと仕様書内で規定されています。 [3] - [CODE(ABNF)[[DFN[パターン]] := 部分パターン [部分パターン分離子 部分パターン] ]] - [CODE(ABNF)[[DFN[部分パターン]] := [接頭辞] 整数部 [小数点 小数部] [接尾辞] ]] - [CODE(ABNF)[[DFN[接頭辞]] := 字句]] - [CODE(ABNF)[[DFN[接尾辞]] := 字句]] - [CODE(ABNF)[[DFN[整数部]] := [数字符 *([集団分離子] 数字符)] *([集団分離子] 零数字) 零数字 ;; J2SE 1.4 では # だけでも OK だけど、 JDK 1.1 では必ず1の位が 0 でないといけない。]] - [CODE(ABNF)[[DFN[小数部]] := *零数字 *数字符]] - [CODE(ABNF)[[DFN[字句]] := 1*(字句文字 / 引用文字列)]] - [CODE(ABNF)[[DFN[字句文字]] := 文字 − 特殊文字]] - [CODE(ABNF)[[DFN[引用文字列]] := "'" 1*文字 "'" / "''"'']] - [CODE(ABNF)[[DFN[特殊文字]] := 零数字 / 数字符 / 小数点 / 集団分離子 / 部分パターン分離子 / 負符号 / 百分率記号 / 千分率記号 / 通貨記号 / "'" ]] - [CODE(ABNF)[[DFN[通貨記号]] := <[U+00A4]>]] - [CODE(ABNF)[[DFN[文字]] := <[U+0000‐U+FFFD]>]] 国際通貨記号は指定された通貨記号に置換されるのですが、 JDK 1.1 の初期版では対応していないとかいうすごい理由ではずされています。 (しかも format pattern must not contain って書いてあるんだけど、それじゃあ quote しても駄目なんだろうか。。。それはひどすぎるような。) で、 [CODE(char)[U+10000]] 以上の文字が使えないという JDK 1.1 の制限は XSLT にも適用されるんですかね? やってらんない。。。 [4] 以下の例では、既定の特殊文字が使われているとします。 :[SAMP(XSLT)[0]]:1桁以上の整数。 [SAMP[2]]→[SAMP[2]], [SAMP[3.14]]→[SAMP[3]] (丸め), [SAMP[10]]→[SAMP[10]] (整数最大桁数は設定されない), [SAMP[-10]]→[SAMP[-10]] (既定の負接頭辞 = 負符号) :[SAMP(XSLT)[00]]:2桁以上の整数。 [SAMP[2]]→[SAMP[02]] (零埋), [SAMP[3.14]]→[SAMP[03]], [SAMP[10]]→[SAMP[10]], [SAMP[100]]→[SAMP[100]] :[SAMP(XSLT)[#0]]:1桁以上の整数 ([SAMP(XSLT)[0]] と同義) :[SAMP(XSLT)[0.0]]:1桁以上の整数部と1桁の小数部。 [SAMP[2]]→[SAMP[2.0]], [SAMP[3.14]]→[SAMP[3.1]] (丸め), [SAMP[10]]→[SAMP[10.0]] :[SAMP(XSLT)[0.#]]:1桁以上の整数部と0桁または1桁の小数部。 [SAMP[2]]→[SAMP[2]], [SAMP[3.14]]→[SAMP[3.1]], [SAMP[10]]→[SAMP[10]] :[SAMP(XSLT)[0.0#]]:1桁以上の整数部と2桁以下の小数部。 [SAMP[2]]→[SAMP[2.0]], [SAMP[3.14]]→[SAMP[3.14]], [SAMP[3.1415]]→[SAMP[3.14]], [SAMP[10]]→[SAMP[10.0]] :[SAMP(XSLT)[¥0]]:接頭辞[CODE[¥]]と1桁以上の整数 : [SAMP[2]]→[SAMP[¥2]], [SAMP[3.14]]→[SAMP[¥3]], [SAMP[100]]→[SAMP[¥100]], [SAMP[-100]]→[SAMP[-¥100]] :[SAMP(XSLT)[00円]]:2桁以上の整数と接尾辞[CODE[円]] :[SAMP(XSLT)['#'00000]]:接頭辞 [CODE[#]] と5桁以上の整数 :[SAMP(XSLT)[000;▲000]]:3桁以上の整数。負の時、接頭辞[CODE[▲]]つき。 :[SAMP(XSLT)[000;▲0]]:[SAMP(XSLT)[000;▲000]] と同義。負部分パターンは接頭辞・接尾辞だけが有効: [SAMP(XSLT)[###,000,000]] : 6桁以上の整数, 3桁ごとに区切り。 :[SAMP(XSLT)[##,#000,000]]:[SAMP(XSLT)[###,000,000]] と同義。桁区切子の幅は小数点に近いものが採用される。 [SAMP(XSLT)[#,##000,000]] や [SAMP(XSLT)[###0,00,000]] も同義。 :[SAMP(XSLT)[000%]]:元の数を100倍して、3桁以上の整数に接尾辞[CODE[%]]。[SAMP[2]]→[SAMP[200%]], [SAMP[3.14]]→[SAMP[314%]], [SAMP[0.001]]→[SAMP[000%]] :[SAMP(XSLT)[‰ = 0]]:接頭辞[CODE[‰ = ]]と、元の数を千倍して、1桁以上の整数。[SAMP[2]]→[SAMP[‰ = 2000]], [SAMP[3.14]]→[SAMP[‰ = 3140]], [SAMP[0.001]]→[SAMP[‰ = 1]] - [5] >>2 それでいて JDK document が Normative References に含まれていない (Informative References にさえ。。。) という素敵な具合☆ [6] [CITE[ものがたり (diary for AtsushiEno) - bug in JDK? java.text.DecimalFormat]] ([[名無しさん]] [sage] [WEAK[2005-06-06 23:03:02 +00:00]]) [7] 3olWBY etuzjxrkmdrs, [url=http://fgiugvxdyhup.com/]fgiugvxdyhup[/url], [link=http://fojiagkusnnb.com/]fojiagkusnnb[/link], http://phmekxqvddfd.com/ ([[glpuwhh]] [vfjzyw@zpkczw.com] [WEAK[2008-08-15 05:06:51 +00:00]]) [8] 3olWBY etuzjxrkmdrs, [url=http://fgiugvxdyhup.com/]fgiugvxdyhup[/url], [link=http://fojiagkusnnb.com/]fojiagkusnnb[/link], http://phmekxqvddfd.com/ ([[glpuwhh]] [vfjzyw@zpkczw.com] [WEAK[2008-08-15 05:06:58 +00:00]]) [9] 3olWBY etuzjxrkmdrs, [url=http://fgiugvxdyhup.com/]fgiugvxdyhup[/url], [link=http://fojiagkusnnb.com/]fojiagkusnnb[/link], http://phmekxqvddfd.com/ ([[glpuwhh]] [vfjzyw@zpkczw.com] [WEAK[2008-08-15 05:07:01 +00:00]])