将所有数字格式化为单个字符串 (Java)

Format all numbers in a single string (Java)

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

这是我要实现的输入和输出示例:

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

我试过搞乱 String#split,但它并没有真正起到作用,因为它变得非常大且重复。

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

  • (\d+) - 捕获整数块一。
  • ([+-]|$) - 为操作符或行尾捕获块二
String s = "1081+34-3954";

Pattern p = Pattern.compile("(\d+)([/*+-]|$)");
Matcher m = p.matcher(s);

StringBuilder sb = new StringBuilder();

while (m.find()) {
    sb.append(String.format("%,d%s", Integer.valueOf(m.group(1)), m.group(2)));
}
String result = sb.toString();

System.out.println(result);

版画

1,081+34-3,954
  • String.format() 采用与 System.out.printf()
  • 相同的参数
  • %,d 用逗号格式化整数作为千位分组分隔符
  • %s为字符串获取运算符。

但是,如果这只是一个示例,而您的模式更复杂,您将不得不对其进行调整。查看以下内容了解更多信息。

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

在 Java 9+ 中,这样做:

String input = "1081+34-3954";

DecimalFormat fmt = new DecimalFormat("#,##0", DecimalFormatSymbols.getInstance(Locale.US));
String result = Pattern.compile("\d+{4,}").matcher(input)
                       .replaceAll(n -> fmt.format(Long.parseLong(n.group())));
System.out.println(result); // prints: 1,081+34-3,954

任何不是 4 位以上数字的文本都保持不变。

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

String input = "1081+34-3954";

DecimalFormat fmt = new DecimalFormat("#,##0", DecimalFormatSymbols.getInstance(Locale.US));
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("\d+{4,}").matcher(input);
while (m.find())
    m.appendReplacement(buf, fmt.format(Long.parseLong(m.group())));
String result = m.appendTail(buf).toString();
System.out.println(result); // prints: 1,081+34-3,954

您可以只使用简单的 String 和 StringBuilder 方法:

public class Test {
  public static String splitStr(String input) {
    StringBuilder str = new StringBuilder();
    boolean change = false;
    if (input.charAt(input.length() - 1) != '+' || input.charAt(input.length() - 1) != '-') {
      input = new StringBuilder(input).append('+').toString();
      change = true;
    }
    int lastIdx = 0;
    for(int i = 0; i < input.length(); i++){
      StringBuilder subStr = new StringBuilder();
      if (input.charAt(i) == '-' || input.charAt(i) == '+') {
       subStr.append(input.substring(lastIdx,i));
       for(int j = subStr.length() - 3; j >= 0; j-=3) {
        subStr.insert(j, ',');
       } 
       lastIdx = i + 1;
      str.append(subStr);
      str.append(input.charAt(i));
      }
    } 
    if (change) {
      str.delete(str.length() - 1, str.length());
    }
    return str.toString();
  }
  public static void main (String[] args) {
    String str = "1081+34-3954";
    String newStr = splitStr(str);
    System.out.println(newStr);
  }
}