在单个字符串中格式化所有数字(Java)

在单个字符串中格式化所有数字(Java),java,formatting,format,Java,Formatting,Format,我一直在为我的AP CSP课程试验计算器应用程序,但在开发过程中遇到了障碍。我一直在尝试将所有数字格式化为一个字符串,以添加逗号,但事实证明这相当困难 以下是我试图实现的输入和输出示例: Input: "1081+34-3954" Output: "1,081+34-3,954" 我尝试过处理字符串分割,但这并没有真正起作用,因为它变得非常大且重复。您可以使用正则表达式这样做 (\\d+)-为整数捕获块1 ([+-]|$)-为操作员或行尾捕获块2 印

我一直在为我的AP CSP课程试验计算器应用程序,但在开发过程中遇到了障碍。我一直在尝试将所有数字格式化为一个字符串,以添加逗号,但事实证明这相当困难

以下是我试图实现的输入和输出示例:

Input: "1081+34-3954"
Output: "1,081+34-3,954"

我尝试过处理字符串分割,但这并没有真正起作用,因为它变得非常大且重复。

您可以使用正则表达式这样做

  • (\\d+)
    -为整数捕获块1
  • ([+-]|$)
    -为操作员或行尾捕获块2
印刷品

1,081+34-3,954
  • String.format()
    采用与
    System.out.printf()相同的参数
  • %,d
    将整数格式化为带逗号的千分分组分隔符
  • %s
    用于字符串获取运算符
但是,如果这只是一个示例,并且您的模式更复杂,那么您必须对其进行调整。查看以下内容以了解更多信息


您可以使用正则表达式替换,方法是搜索数字,然后对其进行解析和重新格式化

在Java 9+中,执行以下操作:

String input=“1081+34-3954”;
DecimalFormat fmt=新的DecimalFormat(“#,##0”,DecimalFormatSymbols.getInstance(Locale.US));
字符串结果=Pattern.compile(“\\d+{4,}”).matcher(输入)
.replaceAll(n->fmt.format(Long.parseLong(n.group())));
System.out.println(结果);//印刷品:1081+34-3954
任何不是4位以上数字的文本都保持不变

在较旧的Java版本中,使用替换循环:

String input=“1081+34-3954”;
DecimalFormat fmt=新的DecimalFormat(“#,##0”,DecimalFormatSymbols.getInstance(Locale.US));
StringBuffer buf=新的StringBuffer();
Matcher m=Pattern.compile(“\\d+{4,}”).Matcher(输入);
while(m.find())
m、 appendReplacement(buf,fmt.format(Long.parseLong(m.group())));
字符串结果=m.appendTail(buf).toString();
System.out.println(结果);//印刷品:1081+34-3954

您可以使用简单的字符串和StringBuilder方法:

公共类测试{
公共静态字符串splitStr(字符串输入){
StringBuilder str=新的StringBuilder();
布尔变化=假;
if(input.charAt(input.length()-1)!='+'| | input.charAt(input.length()-1)!='-'){
input=新的StringBuilder(input).append(+').toString();
改变=正确;
}
int lastIdx=0;
对于(int i=0;i=0;j-=3){
子标题插入(j,,);
} 
lastIdx=i+1;
str.append(subStr);
str.append(input.charAt(i));
}
} 
如果(更改){
str.delete(str.length()-1,str.length());
}
return str.toString();
}
公共静态void main(字符串[]args){
字符串str=“1081+34-3954”;
字符串newStr=splitStr(str);
System.out.println(newStr);
}
}

“我尝试过处理字符串分割,但这并没有真正起作用,因为它变得非常大且重复。”——如果能将此代码视为一个解决问题的工具,那就太好了。可能会有帮助,但您仍然需要解析出数字,可能需要使用类似于
\\d+
replaceAll
或类似的正则表达式。您可以在“\\b”上拆分,它会在单词之间的边界上拆分。如果s是第一个示例,则
s.split(\\b”)
会拆分为“1081”、“+”、“34”、“-”、“3954”它最初工作正常,但经过进一步测试,如果字符串包含“*”或“/”,则会中断。谢谢你!警告:结果取决于区域设置,例如在法国,结果为
1 081+34-3 954
@Lightcaster5我在回答中确实说过,如果字符串更复杂,您必须进行调整。因此,在character类的
[]
之间添加
/
*
,就像我为您所做的那样。您可以通过在String.format方法中指定
Locale
来更改组分隔符,我也提供了一个链接。@WJS,很抱歉,我一定读过了这部分内容。一切正常!非常感谢您的帮助,您的解决方案非常聪明!
1,081+34-3,954