从StringBuilder获取字符串

时间:2013-12-31 07:18:24

标签: java stringbuilder

我正在使用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时,它是否正在执行反向操作?

6 个答案:

答案 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引入的,因为它可以更快地完成那些没有任何并发​​操作的操作....

希望这会有所帮助..