为什么修剪不起作用?

时间:2011-01-18 20:22:12

标签: java

我正在尝试修剪字符串中的前导空格,我不知道我的方法有什么问题,任何建议都会受到赞赏吗?

代码:

this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();

我正在从csv文件中读取poNumber为“IG078565和IG083060”,并且输出也是相同的空格相同的值,不知道为什么?

更新

为更好的背景添加完整方法:

public BillingDTO(String currency, String migrationId, String chargeId, String priceId, String poNumber, String otc,
            String billingClassId, String laborOnly) {
        super();
        this.currency = currency.equals("") ? currency : currency.trim();
        this.migrationId = migrationId.equals("") ? migrationId : migrationId.trim();
        this.chargeId = chargeId.equals("") ? chargeId : chargeId.trim();
        this.priceId = priceId.equals("") ? priceId : priceId.trim();
        this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();
            //poNumber.trim();
        //System.out.println("poNumber:"+this.poNumber.trim());
        //this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();
        this.otc = otc.equals("") ? otc : otc.trim();
        this.billingClassId = billingClassId.equals("") ? billingClassId : billingClassId.trim();
        this.laborOnly = laborOnly.equals("") ? "N" : laborOnly;
    }

感谢。

4 个答案:

答案 0 :(得分:46)

更新您的空格似乎不是空格(ascii = 32)。你的代码是160,这是一个不间断的空间。 trim()无法处理它。所以你必须做这样的事情:

this.poNumber = poNumber.replace(String.valueOf((char) 160), " ").trim();

您最好创建一个实用工具 - YourStringUtils.trim(string)并执行两项操作 - .trim()replace(..)


原始回答:

只需使用this.poNumber = poNumber.trim();

即可

如果poNumber有可能null,那么您可以使用commons-lang中的空保护this.poNumber = StringUtils.trim(poNumber);

如果您希望将trimToEmpty(..)转换为空字符串,也可以使用同一个类中的null

如果你不想依赖commons-lang,那么只需添加一个if子句:

if (poNumber != null) {
    this.poNumber = poNumber.trim();
}

如问题评论中所述 - 确保在修剪后检查正确的变量。您应该检查实例变量。

,你的参数(或局部变量,我无法分辨)不会改变,因为字符串是不可变的。

答案 1 :(得分:3)

您确定要为输出读取正确的变量吗?你有'poNumber',这是原始的未修剪字符串,'this.poNumber',它将获得修剪过的字符串。

答案 2 :(得分:1)

您的文件可能包含未被裁剪的非ascii空格。例如,有一个unicode字符不间断空格(U + 00A0),它显示为空格,但不被trim修剪(这是你可能会看到的,例如在wordpad或其他编辑器中编辑的文档,试图“帮助” “你。”如果你看一下String.trim()的定义,它会删除< =''(即小于或等于20的值)的字符。

因此,打印字符串的字节值(或在十六进制编辑器中查看)并确保您的空格实际上是空格(即十进制值20)。如果您需要其他行为,您可能需要编写自己的修剪实用程序函数,该函数使用正确的unicode Character.isWhiteSpace(char)检查。

答案 3 :(得分:0)

你可以使用这个函数,我对java trim()方法做了一些操作,这比一些replace()方法更好,更快,更有效。

public static String trimAdvanced(String value) {

        Objects.requireNonNull(value);

        int strLength = value.length();
        int len = value.length();
        int st = 0;
        char[] val = value.toCharArray();

        if (strLength == 0) {
            return "";
        }

        while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) {
            st++;
            if (st == strLength) {
                break;
            }
        }
        while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) {
            len--;
            if (len == 0) {
                break;
            }
        }


        return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value;
    }