Tools 是非官方社区Wiki。社区文档正在编写中,欢迎参与。 Wiki编辑答疑群:717421103
版本250722.2
全站通知:

帮助:解析函数/formatnum

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

formatnum是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。

formatnum

数字格式本地化。MediaWiki原生支持。

根据Wiki语言配置,将数字格式本地化。比如对于孟加拉语Wiki {{formatnum:3}}

语法

{{formatnum: 数字 | 选项 }}

参数

  • 数字:需要本地化的数字,支持小数
  • 选项(可选)
    • R - 还原为原始数字,移除分隔符。
    • NOSEP - 数字本地化时,不包含分隔符(对于中英语言无用)。

数字的格式需要符合Wiki平台所设置语言的标准才能获得正确结果。因此对于站点语言为中文的BWiki,此解析函数的作用仅剩下增加/移除逗号分隔符(千分撇)。

示例

  • 基本 {{formatnum: 0012345.67890 }} → 0,012,345.67890
  • 还原 {{formatnum: 12,345.678 | R }} → 12345.678
  • 小数 {{formatnum: .678 }} → .678
  • 无作用 {{formatnum: 12,345.678 | NOSEP }} → 12,345.678

对于设为孟加拉语的Wiki:

  • {{formatnum:987654321.654321}}৯৮,৭৬,৫৪,৩২১.৬৫৪৩২১
  • {{formatnum:৯৮,৭৬,৫৪,৩২১.৬৫৪৩২১ |R}}987654321.654321
  • {{formatnum:987654321.654321 |NOSEP}}৯৮৭৬৫৪৩২১.৬৫৪৩২১ (没有逗号分隔符)


数字分节

各国使用的数字分节符和小数点符号种类繁多。比如大部分欧洲国家及其前殖民地,使用点分节,逗号做小数点,如123.456,789

在MW1.37源码中,有约80种语言的分隔符不用逗号,或小数点不用点。其中约40种语言使用空格作为分隔符。


在中国,相关国家标准是《出版物上数字用法》。现行标准中对多位阿拉伯数字的使用有相关描述,大意为:

为了便于阅读,四位以上的整数和小数可以采用千分撇和千分空两种方式分节。

千分撇:整数部分每三位一组,以“,”分节。小数部分不分节。四位以内的整数可以不分节。如:624,00092,300,0001256
千分空:从小数点起,向左和向右每三位数字一组,组间空四分之一个汉字,即二分之一个阿拉伯数字的位置。四位以内的整数可以不加千分空。如:55 234 367.346 2398 235 358.238 368

各科学技术领域,遵循《有关量、单位和符号的一般原则》:为使多位数字便于阅读,可将数字分成组,从小数点,起向左和向右每三位分成一组,组间留一空隙,但不得用逗号、圆点或其他方式。


底层代码

来自MediaWiki及其扩展的源代码,运行在服务端。此处仅供快速查阅,便于更充分的挖掘其“特性”。

/**
* @param Parser $parser
* @param string $num
* @param string|null $arg
* @return string
*/
public static function formatnum( $parser, $num = '', $arg = null ) {
    if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg ) ) {
        $func = [ $parser->getFunctionLang(), 'parseFormattedNumber' ];
    } elseif (
        self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'nocommafysuffix', $arg )
    ) {
        $func = [ $parser->getFunctionLang(), 'formatNumNoSeparators' ];
        $func = self::getLegacyFormatNum( $parser, $func );
    } else {
        $func = [ $parser->getFunctionLang(), 'formatNum' ];
        $func = self::getLegacyFormatNum( $parser, $func );
    }
    return $parser->markerSkipCallback( $num, $func );
}
代码逻辑:
  • 根据格式参数选择格式化方法
    • R参数(由rawsuffix匹配),将本地化的数字字符串解析为标准的数字字符串。
    • NOSEP参数(由nocommafysuffix匹配),将数字字符串本地化,移除分隔符。
    • 默认:将数字字符串本地化,输出包括分隔符。
  • 虽然调用的函数不同,但其行为一致:处理特殊值、翻译数字,识别并处理分隔符。

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考
崩坏:星穹铁道 - sr

东方归言录 - touhoulostword

赛尔计划 - seerplan

ミナシゴノシゴト - mnsg

StardewValley星露谷物语 - stardewvalley

深空之眼 - dhmmr

天地劫 - tdj

魔法使的约定 - mahoyaku

高达 - gundam

骷髅女孩 - skullgirls