Подтвердить что ты не робот

Почему отделка не работает?

Я пытаюсь обрезать ведущие пробелы из строки, и я не знаю, что не так с моим подходом, любые предложения будут оценены?

Код:

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

am читает poNumber из файла csv как "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;
    }

Спасибо.

4b9b3361

Ответ 1

Обновить. Похоже, что ваш пробел не является пробелом (ascii = 32). У вас есть код 160, который является незавершенным. trim() не обрабатывает. Поэтому вы должны сделать что-то вроде этого:

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

Лучше создать утилиту - YourStringUtils.trim(string) и выполнить две операции - как .trim(), так и replace(..)


Оригинальный ответ:

Просто используйте this.poNumber = poNumber.trim();

Если есть возможность poNumber быть null, то вы можете использовать нулевое безопасное this.poNumber = StringUtils.trim(poNumber); из commons-lang.

Вы также можете использовать trimToEmpty(..) из того же класса, если хотите, чтобы null был преобразован в пустую строку.

Если вы не хотите полагаться на commons-lang, просто добавьте if-clause:

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

Как отмечено в комментариях к вопросу - убедитесь, что вы проверяете правильную переменную после обрезки. Вы должны проверить переменную экземпляра. Ваш параметр (или локальная переменная, я не могу сказать) не изменяется, потому что строки неизменяемы.

Ответ 2

Вы уверены, что читаете правильную переменную для своего вывода? У вас есть "poNumber", который является исходной необработанной строкой и "this.poNumber", который получит обрезанную строку.

Ответ 3

В вашем файле может быть пробел без ascii, который не обрезается. Например, есть unicode символ неразрывного пространства (U + 00A0), который отображается как пробел, но не рассматривается с помощью обрезки (это то, что вы можете увидеть, например, в документе, отредактированном на клавиатуре или других редакторах, которые пытаются "помочь" "вы.) Если вы посмотрите на определение String.trim(), оно удалит символы, которые равны <= '' (т.е. значение меньше или равно 20).

Итак, напечатайте байтовые значения вашей строки (или посмотрите на нее в шестнадцатеричном редакторе) и убедитесь, что ваши пространства фактически являются пространством (т.е. десятичным значением 20). Если вам нужно другое поведение, вам может потребоваться написать свою собственную функцию утилиты trim, которая использует правильную проверку Unicode Character.isWhiteSpace(char).

Ответ 4

Вы можете использовать эту функцию, я сделал некоторые манипуляции с методом 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;
    }