Хобрук: Ваш путь к мастерству в программировании

Число с разделителем групп и десятичным разделителем преобразуется в десятичное число

Я хочу преобразовать число "4,471.26" в десятичное число "4471.26".

На самом деле число "4,471.26" получено как строка и для дальнейшего процесса необходимо преобразовать его в десятичное число.

"4,471.26" - это просто формат, поэтому значение постоянно меняется. Это значение может быть любым, например "654,654,25.54"

Пробовал рассматривать запятую (,) как разделитель групп. Но, похоже, имеет разные значения ASCII.

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(getGroupSeparator(), ""));



  private char getGroupSeparator() {
            DecimalFormat decFormat = new DecimalFormat();
            DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();
            return Character.valueOf(decSymbols.getGroupingSeparator());
        }

Код ниже будет временным решением, но он не будет работать в других географических регионах.

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(",", ""));

Пожалуйста помогите..

04.12.2019

  • разве вы не можете просто .replace() все , ни с чем, и проанализировать это как двойное? 04.12.2019
  • Просто используйте replace, а затем конструктор BigDecimal, который принимает строку. 04.12.2019
  • Спасибо за ответ, но это не работает с другими географическими регионами 04.12.2019
  • Я думаю, он имеет в виду, что в некоторых регионах принято использовать , а не . для обозначения десятичных дробей. 04.12.2019
  • На самом деле не дубликат, а ответы на этот вопрос может помочь. 04.12.2019
  • это правильно Astrogat, я ищу решение, которое могло бы работать для всех регионов 04.12.2019
  • Federico klez Culloca, спасибо за ответ, но число содержит как разделитель групп, так и десятичный разделитель, тогда как ваша реферальная ссылка говорит только о строке, содержащей десятичный разделитель. 04.12.2019
  • В ваших числах всегда есть десятичная часть или они могут быть целыми числами (например, 1234 в тысяче двухстах тридцати четырех)? (также совет: поставьте @ перед именем пользователя, как в @user3302083, при ответе кому-то в комментариях он получит уведомление) 04.12.2019
  • @FedericoklezCulloca и/или всегда есть 2 десятичных знака, когда есть десятичные? 04.12.2019

Ответы:


1

вы можете сделать это так:

public class JavaCodes{
public static void main(String[] args) {
    String str = new String("4,233.19");
    str = str.replaceFirst(",", "");
    System.out.println(Double.valueOf(str));
  }
}
04.12.2019
  • Проблема ОП, похоже, в том, что она должна работать и для других локалей. Например, в Италии это число будет выглядеть как 4.233,19, и ваш ответ не учитывает этого. 04.12.2019

  • 2

    Хорошо, сначала некоторые предположения

    • Вы не знаете локаль заранее
    • Если найден только один разделитель, и он появляется только один раз, мы рассматриваем его как десятичный разделитель (для простоты).
    • Если найден только один разделитель, но он появляется несколько раз, это разделитель тысяч.
    • Любой нецифровой символ является допустимым разделителем
    • Если в строке больше двух нецифровых символов, это ошибка.

    Итак, вот алгоритм

    • Найдите первый нецифровой символ и временно считайте его десятичным разделителем
    • If another non-digit character is found
      • If it's the same as the decimal separator, and we still don't have a thousands seprator, make that the thousands separator and reset the decimal separator
      • Если это то же самое, что и десятичный разделитель, а у нас уже есть разделитель тысяч, это ошибка.
      • Если это не то же самое, что десятичный разделитель, это разделитель тысяч
    • Удалить из исходной строки все вхождения разделителя тысяч (если он есть)
    • Замените десятичный разделитель точкой
    • Разбирать как двойной.

    И вот код.

    public class Test {
    
        public static double parseNumber(String x) {
            Character thousandsSeparator = null;
            Character decimalSeparator = null;
    
            for (int i = 0; i < x.length(); i++) {
                if (!Character.isDigit(x.charAt(i))) {
                    if (decimalSeparator == null) {
                        decimalSeparator = x.charAt(i);
                    } else {
                        if (decimalSeparator.equals(x.charAt(i))) {
                            if (thousandsSeparator == null) {
                                thousandsSeparator = x.charAt(i);
                                decimalSeparator = null;
                            } else {
                                if (!thousandsSeparator.equals(x.charAt(i))) {
                                    throw new IllegalArgumentException();
                                }
                            }
                        } else {
                            thousandsSeparator = x.charAt(i);
                        }
                    }
                }
            }
    
            // remove thousands separator
            if (thousandsSeparator != null) {
                int formerSeparatorPosition;
                while ((formerSeparatorPosition = x.indexOf(thousandsSeparator)) != -1) {
                    x = x.substring(0, formerSeparatorPosition) + x.substring(formerSeparatorPosition + 1);
                }
            }
    
            // replace decimal separator with a dot
            if (decimalSeparator != null) {
                x = x.replace(decimalSeparator, '.');
            }
            return Double.parseDouble(x);
    
        }
    
        public static void main(String args[]) {
            System.out.println(parseNumber("123.45"));
            System.out.println(parseNumber("123,45"));
            System.out.println(parseNumber("1.234,5"));
            System.out.println(parseNumber("1,234.5"));
            System.out.println(parseNumber("1,234,567.512"));
            System.out.println(parseNumber("1.234.567,512"));
            ystem.out.println(parseNumber("1.234.567"));
            System.out.println(parseNumber("1_234_567|34")); // works with any two characters, if there are just two
            try {
                System.out.println(parseNumber("1_234_567|34,7")); // invalid
            } catch (IllegalArgumentException e) {
                System.out.println("Too many separators!");
            }
        }
    }
    
    04.12.2019

    3

    Довольно косвенно анализировать BigDecimal. Для double это проще, но с плавающей запятой - это всего лишь приближение, и точность числа потеряет. 0,2 == 0,20 == 0,200 == (на самом деле что-то вроде) 0,1999999987.

        String text = "4,471.26";
        DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
        format.setParseBigDecimal(true);
        BigDecimal number = (BigDecimal) format.parseObject(text);
        // number.scale() == 2
    

    В локали для США используются нужные вам разделители.

    04.12.2019

    4

    Спасибо, ребята, за все ваши предложения и помощь. Я понимаю следующее решение. Преобразуйте его в десятичное число и применимо ко всем географическим регионам.

    public static void geoSp() {
        String a = "4.233,19";
        NumberFormat as = NumberFormat.getInstance();
        double myNumber = 0;
        try {
            myNumber = as.parse(a).doubleValue();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(String.valueOf(myNumber));
    }
    
       gives  Out put :- 4233.19
    
    05.12.2019
    Новые материалы

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..