如何在 Java 中的数字和字符串之间插入 space?
How to insert a space between a number and a string in Java?
我正在使用 Java 中的 java.util.scanner 功能(太棒了!)但我还没有弄清楚如何扫描附有单位的数字。例如,我知道您可以在数字和非数字字符之间插入空格,这样“47mg”就变成了“47mg”。这将解决大多数情况。但是,到目前为止,我发现的 none 解决方案似乎可以处理其中包含指数的数字(scientific/engineering 表示法)。例如,我希望它将“47E-3mg”转换为“47E-3 mg”。关于如何做到这一点的任何想法?谢谢!
更新:这里有更多背景信息。在 C++ 中,class 具有类似于扫描位的功能,它知道数字在何处停止,并且在附加字符串时不会给出错误。它只是在数字停止的地方停止。这是 C++ 中的一个简单示例:
istringstream myStream;
string tempString;
double tempDouble;
string myString = " USE 1.23E-3mg ";
myStream.str(myString);
myStream >> tempString;
cout << "String:" << tempString << ":" << endl;
myStream >> tempDouble;
cout <<"Double:"<<tempDouble<<endl;
myStream >> tempString;
cout << "String:" << tempString << ":" << endl;
return 0;
它将输出:
String:USE:
Double:0.00123
String:mg:
更新 2:根据其中一个答案,我认为解决方案很接近。这就是我们现在所拥有的。它几乎可以工作。只需要处理多个条目...有人看到可以更改什么吗?
//String myString = "1.23E-3"; //Works
//String myString = "1.23E-3mg"; //Works
//String myString = "1.23E-3g"; //Works
String myString = "1.23mg 1.23mg";
System.out.println(myString.replaceAll("([a-z]+)$", "
"));
您可以使用 StringBuilder
StringBuilder sb = new StringBuilder("47E-3mg");
sb.insert(sb.indexOf("mg"), " "); //insert(index, string)
System.out.println(sb);
产量:47E-3 毫克
假设您有以下情况:
String [] data = {"43E-2mg", "96.2mg", "55cc"};
这让您可以用 space 和那些相同的字符替换字符串末尾的一个或多个字符。
for (String s : data) {
s = s.replaceAll("([a-z]+)$", " ");
System.out.println(s);
}
打印
43E-2 mg
96.2 mg
55 cc
如果您想捕获单独的部分以进行额外处理,您可以在数量和单位之间的零宽度间隙上拆分。
(?<![a-z])
- 前面没有 a-z
(?=[a-z]+$)
- 后跟一个或多个 a-z
后跟一个新行。
for (String s : data) {
String[] parts = s.split("(?<![a-z])(?=[a-z]+$)");
System.out.println(Arrays.toString(parts));
}
打印
[43E-2, mg]
[96.2, mg]
[55, cc]
我正在使用 Java 中的 java.util.scanner 功能(太棒了!)但我还没有弄清楚如何扫描附有单位的数字。例如,我知道您可以在数字和非数字字符之间插入空格,这样“47mg”就变成了“47mg”。这将解决大多数情况。但是,到目前为止,我发现的 none 解决方案似乎可以处理其中包含指数的数字(scientific/engineering 表示法)。例如,我希望它将“47E-3mg”转换为“47E-3 mg”。关于如何做到这一点的任何想法?谢谢!
更新:这里有更多背景信息。在 C++ 中,class 具有类似于扫描位的功能,它知道数字在何处停止,并且在附加字符串时不会给出错误。它只是在数字停止的地方停止。这是 C++ 中的一个简单示例:
istringstream myStream;
string tempString;
double tempDouble;
string myString = " USE 1.23E-3mg ";
myStream.str(myString);
myStream >> tempString;
cout << "String:" << tempString << ":" << endl;
myStream >> tempDouble;
cout <<"Double:"<<tempDouble<<endl;
myStream >> tempString;
cout << "String:" << tempString << ":" << endl;
return 0;
它将输出: String:USE: Double:0.00123 String:mg:
更新 2:根据其中一个答案,我认为解决方案很接近。这就是我们现在所拥有的。它几乎可以工作。只需要处理多个条目...有人看到可以更改什么吗?
//String myString = "1.23E-3"; //Works
//String myString = "1.23E-3mg"; //Works
//String myString = "1.23E-3g"; //Works
String myString = "1.23mg 1.23mg";
System.out.println(myString.replaceAll("([a-z]+)$", "
"));
您可以使用 StringBuilder
StringBuilder sb = new StringBuilder("47E-3mg");
sb.insert(sb.indexOf("mg"), " "); //insert(index, string)
System.out.println(sb);
产量:47E-3 毫克
假设您有以下情况:
String [] data = {"43E-2mg", "96.2mg", "55cc"};
这让您可以用 space 和那些相同的字符替换字符串末尾的一个或多个字符。
for (String s : data) {
s = s.replaceAll("([a-z]+)$", " ");
System.out.println(s);
}
打印
43E-2 mg
96.2 mg
55 cc
如果您想捕获单独的部分以进行额外处理,您可以在数量和单位之间的零宽度间隙上拆分。
(?<![a-z])
- 前面没有a-z
(?=[a-z]+$)
- 后跟一个或多个a-z
后跟一个新行。
for (String s : data) {
String[] parts = s.split("(?<![a-z])(?=[a-z]+$)");
System.out.println(Arrays.toString(parts));
}
打印
[43E-2, mg]
[96.2, mg]
[55, cc]