如何使用Java或Groovy printf向字符串添加千位分隔符

如何使用Java或Groovy printf向字符串添加千位分隔符,java,groovy,printf,Java,Groovy,Printf,在Java中,我需要在格式化为字符串的十进制数中添加千位分隔符。然而,我并不想要一个百万或数十亿的分隔符。。。只有一个保留了数字的小数部分的千位分隔符 9==9 999.999==999.999 9999==9999 999999999.999==999999999.999 我不需要严格使用printf,但是转换必须尽可能快 输入和输出类型必须都是字符串 谢谢 首先,这个问题并不像看上去那么简单,因为千位分隔符并不总是逗号,而是取决于用户的区域设置。在某些情况下,它实际上是一个句点,这可能会导致

在Java中,我需要在格式化为字符串的十进制数中添加千位分隔符。然而,我并不想要一个百万或数十亿的分隔符。。。只有一个保留了数字的小数部分的千位分隔符

9==9

999.999==999.999

9999==9999

999999999.999==999999999.999

我不需要严格使用printf,但是转换必须尽可能快

输入和输出类型必须都是字符串


谢谢

首先,这个问题并不像看上去那么简单,因为千位分隔符并不总是逗号,而是取决于用户的区域设置。在某些情况下,它实际上是一个句点,这可能会导致您为字符串操作编写的任何代码出现问题

如果您希望尊重用户的区域设置,则需要更仔细的方法,另一方面,如果您只想考虑这一特定情况,而不关心区域设置,则可以尝试以下方法:

String s = "99999999.999";
s.replaceFirst("^(\\d+)(\\d{3})(\\.|$)", "$1,$2$3");

到目前为止,最好的解决方案是:


返回text.replaceFirst(“^(\d+)(\d{3})(\.\124;$)”,“$1,$2$3”)

java.text.NumberFormat是您所需要的


访问。

您看过java.text.DecimalFormat吗?因为问题要求输入和输出必须是字符串类型,使用DecimalFormat不需要您先将字符串解析为数字,然后再将其格式化为字符串吗?我看过DecimalFormat,认为它不适用于此。这个问题很具体,也很奇怪!是的,它需要转换成数字,然后再转换回来,当然可以完成这项工作。我假设op想要一些高水平的东西,尽管需要效率,否则显而易见的是,它可以识别出性能指标。连接lhs子字符串,逗号和rhs子字符串可能是最好的解决方案,concat可以在数组中完成,但是stringbuilder可能可以。我不想转换为数字类型,因为我担心会丢失精度。我真的认为类型需要保持为字符串。到目前为止,唯一的解决方案是使用字符串连接,自己解析整数和小数。还要注意的是,如果您想对区域性敏感,它不是“千位分隔符”,而是“分组分隔符”,因为某些东亚文化中每四位都有一个,而不是每三位。我不想尊重任何人的区域设置。它必须始终是逗号,并且必须始终位于美国英语中通常称为“千”的位置。上面的正则表达式不能解决这个问题,因为小数点的小数部分不能保证为3。首选是小数部分任意长。此正则表达式不适用于输入9999,输入9999返回9999而不是9999。FWIW,这里是一个测试用例:[“:”,“9”:“9”,“98”:“98”,“987”:“987”,“987.6”:“987.6”,“987.65”:“987.65”,“987.654”:“987.654”,“987.6543”:“987.6543”,“9876”:“9876”,“98765”:“98765”,“9876543”:“9876543”,“9876.5”:“9876.5”:“9876.5”,“9876.5”:“9876.5”,“9876.5”,“9876.54”,“9876.54”,“9876.543”:“9876.543”,“98764321978654321.987654321:”98764321978654321.987654321“,]”。每个{expected,input->assert expected==input.replaceFirst(\\d)(\\d)(\\d{3}\\),“$1,$2')我已经更新了正则表达式,现在应该可以正确处理所有情况。不,单元测试仍然失败。这次“987.6543”转换为“987.6543”“--在这里插入简洁的正则表达式引语--这不起作用,你需要避开你的斜杠,就像在我的例子中一样。人们能感激地解释他们为什么投反对票吗?我投了反对票,因为这在NumberFormat中是不可能的。这是错误的答案。
def test='6816843541.5432'
index = test.indexOf('.')
test = test.substring(0,index - 3 ) + ',' + test.substring(index-3,test.size())
println test