内置的DecimalFormat仅允许您指定小数点右侧的位数.
由于将数字表示为double的限制,数字格式化需要在其中包含一定程度的舍入.在一般情况下,舍入必须是多个有效数字(默认情况下是双精度),否则你的格式化双精度将最终显示像3.5999999而不是3.6的东西.
我能找到的最接近的解决方案是使用
new BigDecimal(double, new MathContext(14, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString()
Run Code Online (Sandbox Code Playgroud)
但是,这只提供单一格式.如果我需要通常格式化它(组分隔符,小数点分隔符,限制数字位数,填充等),JDK库中没有任何内容.
是否有一个通用数字格式库,可以正确处理有效数字的舍入?
有人问了一些例子.所以,假设我想格式化为4位有效数字,然后:
0.000003599999 -> 0.0000036
4.12345 -> 4.123
1234.345 -> 1234
Run Code Online (Sandbox Code Playgroud)
我们采取的一般方法是舍入到14位数,因为根据情况,双倍只能代表大约15-17位有效数字(或者我已经读过).
我有这个
$example = "1234567"
$subtotal = number_format($example, 2, '.', '');
Run Code Online (Sandbox Code Playgroud)
$ subtotal的返回是"1234567.00"
如何修改$ subtotal的定义,使它像这样"1,234,567.00"
我想格式化一个数字并用angular来复数.
例如(给定一些比特币):
0 => "John has no bitcoins"
1 => "John has 1 bitcoin"
2 => "John has 2 bitcoins"
12345.6789 => "John has 12,345.67 bitcoins"
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
John has
<ng-pluralize count="bitcoin_amount | round:2"
when="{'0': 'no bitcoins',
'1': '1 bitcoin',
'other': '{} bitcoins'}">
</ng-pluralize>
Run Code Online (Sandbox Code Playgroud)
但这种失败草草收场,因为对数字等于或大于1000更大,它们是作为传递1,000的count属性,所以只有几千所示.例如:
1001 => 1
1000 => 1
2000 => 2
etc...
Run Code Online (Sandbox Code Playgroud)
尝试粘贴1,000在框中number of people的这个演示的例子.
如何格式化数字并将其复数为有角度?
填充字符串的最简单方法是将左侧的0填充为0
"110"="00000110"
"11110000"="11110000"
我曾尝试使用format!宏,但它只用空间填充到右边:
format!("{:08}", string);
Run Code Online (Sandbox Code Playgroud) 我想将数字转换为字符串表示形式,其格式类似于Stack Overflow信誉显示.
例如
Time.new.month返回10月之前任何月份的单个数字表示(例如6月6),但我想要一个2位数格式(即6我想要的而不是06).
我写了以下解决方案,我要求看一些其他/更好的解决方案.
s = 6.to_s; s[1]=s[0]; s[0] = '0'; s #=> '06'
Run Code Online (Sandbox Code Playgroud) 我如何使用NumberFormat格式化double给定的值Locale(默认语言环境就足够了)和给定的小数位数?
例如,我有以下值:
double d1 = 123456.78;
double d2 = 567890;
Run Code Online (Sandbox Code Playgroud)
我想以下列方式打印它们,例如使用美国语言环境和2个小数位:
123,456.78
567,890.00
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我实际上并不关心舍入模式,因为这些双值是从BigDecimal给定比例的a 获得的,因此它们的小数位数总是小于或等于我想要打印的小数位数.
编辑:
为了使事情更清楚,问题是我想以依赖于语言环境的方式显示钱,但是具有固定数量的小数位.上面的示例显示了如果系统区域设置是如何格式化值en_US.现在假设,系统区域设置是cs_CZ(捷克语),因此应以这种方式格式化相同的数字:
123 456,78
567 890,00
Run Code Online (Sandbox Code Playgroud)
现在,如何设置NumberFormat以始终显示2个小数位,但是根据当前区域设置显示千位分隔符和小数点?
我正在写一个报警网络应用程序.我有两个数字输入,一个用于小时,一个用于分钟.因此,当我使用键盘箭头时,它们从0到23/59.是否有HTML本地方式使它们从00(01,02等)到23/59而不是?
我只担心UI方面,因为我的JS管理缺失的0无论如何.
编辑 - 根据要求:
是)我有的 :

我想要的是 :

而不是从0,1,2到59,我想在数字小于10(00,01,02到59)时自动获得前导0.
问题出在Python 2.6上,这就是我们在生产中所拥有的.
我有这个要求用逗号格式化数字(如1234567.0987或1234567.0),以及小数点后指定的位数.因此,如果精度为3,则1234567.0987可能看起来像1,234,567.099.
我尝试使用Locale,正如许多问题的答案所示,问题是小数点后产生两位数,这对我的要求是不可接受的.
我尝试在其他地方搜索,但没有找到任何解决方案,最后我自己创建了一个方法:
def format_float(value, precision = 4):
formatString = "%0." + str(precision) + "f"
str_val = formatString % value
first, second = str_val.split('.')
first = int(first)
group = []
while True:
result, mod = first / 1000, first % 1000
group.append(str(mod))
if result == 0:
break
first = result
group.reverse()
return ','.join(group) + '.' + second
Run Code Online (Sandbox Code Playgroud)
我试图运行一些测试来测试该方法,它工作正常:
# default 4 digits precision
assert format_float(1234567890.0876543) == '1,234,567,890.0877'
assert format_float(1.2) == '1.2000'
assert format_float(1234) == '1,234.0000'
assert format_float(0) == …Run Code Online (Sandbox Code Playgroud)