将所有数字格式化为单个字符串 (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);
}
}
我一直在为我的 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);
}
}