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