<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XSLT</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">関数</anchor>
<code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor> <code class="XPathf">format-number</code> (<var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">数値</anchor></var>, <var>文字列</var>, <var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">修飾名</anchor></var>?)</code>
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(<anchor-external a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.w3.org/TR/xslt#function-format-number">http://www.w3.org/TR/xslt#function-format-number</anchor-external>)</weak>
を使うと、任意の数値を任意の書式で表現したものを得ることが出来ます。</p><p>第1引数が対象の数値, 第2引数が適用する書式文字列, 
第3引数が十進数書式 (decimal‐format) の名前です。
省略時は既定のものとなります。</p><p>第3引数で指定されている修飾名が
<code class="XSLTe"><var>xslt:</var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">decimal-format</anchor></code>
要素で定義されていないなら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">誤り</anchor>です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> 第2引数の書式は、
<code class="java">java.text.<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DecimalFormat</anchor></code>
で使われているものです。
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書には Java での実装を強要するものではないとか書いていますが、一方で書式が JDK の文書参照になっているとかいう依存ぶり。</weak><ul><li><em>Class java.text.DecimalFormat</em> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://web.archive.org/web/19990506013731/http://java.sun.com/products/jdk/1.1/docs/api/java.text.DecimalFormat.html">http://web.archive.org/web/19990506013731/http://java.sun.com/products/jdk/1.1/docs/api/java.text.DecimalFormat.html</anchor-external> : XSLT 1.0 が参照している文書 (JDK 1.1)</li><li><em>DecimalFormat (Java 2 Platform SE v1.4.1)</em> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://java.sun.com/j2se/1.4.1/docs/api/java/text/DecimalFormat.html">http://java.sun.com/j2se/1.4.1/docs/api/java/text/DecimalFormat.html</anchor-external> : (J2SE 1.4.1)</li><li><em>DecimalFormat (Java 2 プラットフォーム SE v1.4.0)</em> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/text/DecimalFormat.html">http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/text/DecimalFormat.html</anchor-external> : (J2SE 1.4.0 日本語)</li></ul></p><p>ちなみに XSLT 2.0 WD ではパワーアップしたものがちゃんと仕様書内で規定されています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end><ul><li><code class="ABNF"><dfn>パターン</dfn> := 部分パターン [部分パターン分離子 部分パターン] </code></li><li><code class="ABNF"><dfn>部分パターン</dfn> := [接頭辞] 整数部 [小数点 小数部<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">接尾辞] </title></code></li><li><code class="ABNF"><dfn>接頭辞</dfn> := 字句</code></li><li><code class="ABNF"><dfn>接尾辞</dfn> := 字句</code></li><li><code class="ABNF"><dfn>整数部</dfn> := [数字符 *([集団分離子] 数字符)] *([集団分離子] 零数字) 零数字 ;; J2SE 1.4 では # だけでも OK だけど、 JDK 1.1 では必ず1の位が 0 でないといけない。</code></li><li><code class="ABNF"><dfn>小数部</dfn> := *零数字 *数字符</code></li><li><code class="ABNF"><dfn>字句</dfn> := 1*(字句文字 / 引用文字列)</code></li><li><code class="ABNF"><dfn>字句文字</dfn> := 文字 − 特殊文字</code></li><li><code class="ABNF"><dfn>引用文字列</dfn> := &quot;'&quot; 1*文字 &quot;'&quot; / &quot;<em>&quot;</em></code></li><li><code class="ABNF"><dfn>特殊文字</dfn> := 零数字 / 数字符 / 小数点 / 集団分離子 / 部分パターン分離子 / 負符号 / 百分率記号 / 千分率記号 / 通貨記号 / &quot;'&quot; </code></li><li><code class="ABNF"><dfn>通貨記号</dfn> := &lt;[U+00A4]&gt;</code></li><li><code class="ABNF"><dfn>文字</dfn> := &lt;[U+0000‐U+FFFD]&gt;</code></li></ul></p><p>国際通貨記号は指定された通貨記号に置換されるのですが、
JDK 1.1 の初期版では対応していないとかいうすごい理由ではずされています。
(しかも format pattern must not contain って書いてあるんだけど、それじゃあ quote しても駄目なんだろうか。。。それはひどすぎるような。)
で、 <code class="char">U+10000</code> 以上の文字が使えないという JDK
1.1 の制限は XSLT にも適用されるんですかね?
やってらんない。。。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 以下の例では、既定の特殊文字が使われているとします。<dl><dt><samp class="XSLT">0</samp></dt><dd>1桁以上の整数。 <samp>2</samp>→<samp>2</samp>, <samp>3.14</samp>→<samp>3</samp> (丸め), <samp>10</samp>→<samp>10</samp> (整数最大桁数は設定されない), <samp>-10</samp>→<samp>-10</samp> (既定の負接頭辞 = 負符号)</dd><dt><samp class="XSLT">00</samp></dt><dd>2桁以上の整数。 <samp>2</samp>→<samp>02</samp> (零埋), <samp>3.14</samp>→<samp>03</samp>, <samp>10</samp>→<samp>10</samp>, <samp>100</samp>→<samp>100</samp></dd><dt><samp class="XSLT">#0</samp></dt><dd>1桁以上の整数 (<samp class="XSLT">0</samp> と同義)</dd><dt><samp class="XSLT">0.0</samp></dt><dd>1桁以上の整数部と1桁の小数部。 <samp>2</samp>→<samp>2.0</samp>, <samp>3.14</samp>→<samp>3.1</samp> (丸め), <samp>10</samp>→<samp>10.0</samp></dd><dt><samp class="XSLT">0.#</samp></dt><dd>1桁以上の整数部と0桁または1桁の小数部。 <samp>2</samp>→<samp>2</samp>, <samp>3.14</samp>→<samp>3.1</samp>, <samp>10</samp>→<samp>10</samp></dd><dt><samp class="XSLT">0.0#</samp></dt><dd>1桁以上の整数部と2桁以下の小数部。 <samp>2</samp>→<samp>2.0</samp>, <samp>3.14</samp>→<samp>3.14</samp>, <samp>3.1415</samp>→<samp>3.14</samp>, <samp>10</samp>→<samp>10.0</samp></dd><dt><samp class="XSLT">¥0</samp></dt><dd>接頭辞<code>¥</code>と1桁以上の整数 : <samp>2</samp>→<samp>¥2</samp>, <samp>3.14</samp>→<samp>¥3</samp>, <samp>100</samp>→<samp>¥100</samp>, <samp>-100</samp>→<samp>-¥100</samp></dd><dt><samp class="XSLT">00円</samp></dt><dd>2桁以上の整数と接尾辞<code>円</code></dd><dt><samp class="XSLT">'#'00000</samp></dt><dd>接頭辞 <code>#</code> と5桁以上の整数</dd><dt><samp class="XSLT">000;▲000</samp></dt><dd>3桁以上の整数。負の時、接頭辞<code>▲</code>つき。</dd><dt><samp class="XSLT">000;▲0</samp></dt><dd><samp class="XSLT">000;▲000</samp> と同義。負部分パターンは接頭辞・接尾辞だけが有効: <samp class="XSLT">###,000,000</samp> : 6桁以上の整数, 3桁ごとに区切り。</dd><dt><samp class="XSLT">##,#000,000</samp></dt><dd><samp class="XSLT">###,000,000</samp> と同義。桁区切子の幅は小数点に近いものが採用される。 <samp class="XSLT">#,##000,000</samp> や <samp class="XSLT">###0,00,000</samp> も同義。</dd><dt><samp class="XSLT">000%</samp></dt><dd>元の数を100倍して、3桁以上の整数に接尾辞<code>%</code>。<samp>2</samp>→<samp>200%</samp>, <samp>3.14</samp>→<samp>314%</samp>, <samp>0.001</samp>→<samp>000%</samp></dd><dt><samp class="XSLT">‰ = 0</samp></dt><dd>接頭辞<code>‰ = </code>と、元の数を千倍して、1桁以上の整数。<samp>2</samp>→<samp>‰ = 2000</samp>, <samp>3.14</samp>→<samp>‰ = 3140</samp>, <samp>0.001</samp>→<samp>‰ = 1</samp></dd></dl></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> それでいて JDK document が Normative References に含まれていない (Informative References にさえ。。。) という素敵な具合☆</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end>
<cite>ものがたり (diary for AtsushiEno) - bug in JDK? java.text.DecimalFormat</cite> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://d.hatena.ne.jp/atsushieno/20050606/p1">http://d.hatena.ne.jp/atsushieno/20050606/p1</anchor-external>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor> [sage] <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2005-06-06 23:03:02 +00:00</weak>)</p></body></html>