我正在使用StringBuilder
消除一些不必要的字符,我得到了一些奇怪的结果。
String value = "1.045,00";
StringBuilder sanitized = new StringBuilder();
boolean decimalSeparatorFound = false;
char[] chars = value.toCharArray();
for (int i = chars.length-1; i >= 0; i--) {
if (chars[i] == ',' || chars[i] == '.') {
if (decimalSeparatorFound) continue; // skip this char
decimalSeparatorFound = true;
sanitized.append('.');
} else {
sanitized.append(chars[i]);
}
}
这里我会在sanitized
中得到00.5401,但当我将其转换为字符串时
String s = sanitized.reverse.toString();
并且预计会将s
的值打印为1045.00
,但会打印为00.5401
。
然后我尝试了
StringBuilder sb = sanitized.reverse();
String s1 = sb.toString();
现在这次正确打印了。
这里我的问题为什么StringBuilder的表现如此?在将值赋给String s
时,它是否正在执行反向操作?
答案 0 :(得分:1)
“我的问题为什么StringBuilder的表现如此?”
发生的事情是,如果你在同一个代码中有两种方式,它会反转一次,然后再反转
StringBuilder sb = sanitized.reverse(); // first reverse
String s1 = sb.toString();
String s = sanitized.reverse().toString(); // second reverse
System.out.println(s1);
System.out.println(s);
OUTPUT
1045.00
00.5401
但是如果你取出第一个反向并且只是自己使用第二个反转,那么你得到正确的输出
String s = sanitized.reverse().toString();
System.out.println(s);
OUPUT
1045.00
答案 1 :(得分:0)
你没有以正确的方式调用反向方法。
你应该用括号称它reverse()
。
你的行应该是这样的:
// now they will give you the same results
String s1 = sanitized.reverse().toString();
System.out.println(s1) //1045.00
StringBuilder sb = sanitized.reverse();
String s1 = sb.toString();
System.out.println(s1) //1045.00
答案 2 :(得分:0)
更改追加插入
sanitized.insert(0, '.');
} else {
sanitized.insert(0, chars[i]);
}
我会做得更简单
String decimalSeparator = s.indexOf(',') > s.indexOf('.') ? "." : ",";
s = s.replace(decimalSeparator, "");
答案 3 :(得分:0)
而不是这样做
for (int i = chars.length-1; i >= 0; i--)
你应该试试这个
for (int i = 0; i <chars.length; i++)
可能是你正在反向使用两次。
答案 4 :(得分:0)
在这个循环中,你通过从chars [chars.length-1]追加到StringBuilder到chars [0]
来反转字符串for (int i = chars.length-1; i >= 0; i--) {
if (chars[i] == ',' || chars[i] == '.') {
if (decimalSeparatorFound) continue; // skip this char
decimalSeparatorFound = true;
sanitized.append('.');
} else {
sanitized.append(chars[i]);
}
}
这是回归的实际原因。你应该像这样改变循环
for (int i = 0; i < chars.length; i++) {
if (chars[i] == ',' || chars[i] == '.') {
if (decimalSeparatorFound) continue; // skip this char
decimalSeparatorFound = true;
sanitized.append('.');
} else {
sanitized.append(chars[i]);
}
}
所以,它会像你期望的那样工作
答案 5 :(得分:0)
请你试试这个:
使用StringBuilder或StringBuffer的方法... reverse()
public class StringReverse
{
public static void main(String[] args)
{
String string=args[0];
String reverse = new StringBuilder(string).reverse().toString();
System.out.println("\nString before reverse: "+string);
System.out.println("String after reverse: "+reverse);
}
}
StringBuffer是线程安全的,其中StringBuilder是非线程安全 .....
StringBuilder是从Java 1.5引入的,因为它可以更快地完成那些没有任何并发操作的操作....
希望这会有所帮助..