Java 为什么修剪不起作用?

Java 为什么修剪不起作用?,java,Java,我正在尝试从字符串中删除前导空格,我不知道我的方法有什么问题,如果您有任何建议,我们将不胜感激 代码: this.poNumber=poNumber.equals(“”)?poNumber:poNumber.trim() 我从csv文件中读取poNumber作为“IG078565和IG083060”,并输出同样的值和相同的空白,不知道为什么 已更新 添加完整方法以获得更好的上下文: public BillingDTO(String currency, String migrationId, St

我正在尝试从字符串中删除前导空格,我不知道我的方法有什么问题,如果您有任何建议,我们将不胜感激

代码:

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;
    }

谢谢

更新您的空白似乎不是空白(ascii=32)。你的密码是160,这是一个不间断的空格<代码>修剪()。所以你必须这样做:

this.poNumber = poNumber.replace(String.valueOf((char) 160), " ").trim();
您最好创建一个实用工具-
YourStringUtils.trim(string)
,然后执行两个操作-
.trim()
替换(…)


原始答案:

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

如果
poNumber
可能为
null
,则可以使用空安全
this.poNumber=StringUtils.trim(poNumber)

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

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

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

如问题下方的注释所述-确保在修剪后检查了正确的变量。您应该检查实例变量。您的参数(或局部变量,我看不出来)没有更改,因为字符串是不可变的。

您确定读取的输出变量正确吗?“poNumber”是原始的未修剪字符串,“this.poNumber”将获得修剪字符串。

您的文件可能有未被修剪的非ascii空白。例如,有一个unicode字符不间断空格(U+00A0),显示为空白,但trim不考虑它(这是您可能会看到的,例如在wordpad中编辑的文档或其他试图“帮助”您的编辑器中)。如果您查看String.trim()的定义它删除了的字符。你可以使用这个函数,我对java trim()方法做了一些操作,这比一些replace()方法更好、更快、更有效

公共静态字符串高级(字符串值){
对象。requirennoull(值);
int strLength=value.length();
int len=value.length();
int st=0;
char[]val=value.toCharArray();
如果(strLength==0){
返回“”;
}
while((st
您希望代码做什么?它做什么?如果给定空字符串,String#trim()将返回原始字符串,因此我不确定三元条件是否必要。。。有人想告诉我我是否错了?@Michael:代码应该检查值是否为Null,然后按db的形式插入,如果不是Null,则应该删除前导空格和尾随空格,然后插入。我注意到您在赋值的左侧使用了this.poNumber,而在右侧使用了poNumber。是否同时存在名为
poNumber
的实例变量和局部变量?@Rachel:您不能期望
poNumber
之后被修剪,只有
this.poNumber
。您遇到了哪个错误?@Rachel-我添加了一个关于
null
的更新。你的代码也会给出null@Rachel您的原始代码将给出相同的错误。你可能把java和其他语言混淆了。我确实使用了
StringUtils.trim(poNumber)
,并且得到了poNumber:IG078565和IG083060的值,它们仍然有空格。真棒的回答Bozho,这救了我的命!作为一个小的调整,我建议使用
replace(String.valueOf((char)160),“”)而不是
替换(String.valueOf((char)160),“”)(即,用实际空格替换非中断空格,trim()可以删除该空格)。这样,如果在字符串的中间有其他非破坏空间,则它们将被替换为普通空间而不是空白。<代码>替换((char)160,'')<代码>可以被使用。如何执行它,不知道如何打印字节代码值。小注释-“十进制值20”可能应该读取。“十进制值32”或“十六进制值20”。。。
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;
    }