DemonCoderadd Ответов: 2

Код терпит крах, когда я ввожу менее чем 15-значный номер


Я сделал приложение для преобразования цифр в текст, но оно просто вылетает, если я ввожу меньше этого 15-значного числа.Он также показывает следующие десятки мест, где он должен быть.Если я введу больше, чем 15 цифр, то это займет только первые 15, в то время как он ничего не должен делать

package com.example.convertnumbertotext;

import java.math.BigInteger;
import java.text.DecimalFormat;

public class EnglishNumberToWords {

    private static BigInteger bi = new BigInteger("100");
    private static BigInteger bi2 = new BigInteger("20");
    private static BigInteger bi3 = new BigInteger("10");
    private static final String[] tensNames = { "", " ten", " twenty", " thirty", " forty",
            " fifty", " sixty", " seventy", " eighty", " ninety", };

    private static final String[] numNames = { "", " one", " two", " three", " four", " five",
            " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen",
            " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen" };

    private static String convertLessThanOneThousand(BigInteger number) {
        String veryFar = "";
        BigInteger[] bii = number.divideAndRemainder(bi);
        BigInteger[] bii2 = number.divideAndRemainder(bi3);
        int resut = bii[1].compareTo(bi2);

        if (resut == -1) {
            veryFar = numNames[bii[1].intValue()];

            number = number.divide(bi);
        } else if (resut == 1 || resut == 0) {
            veryFar = numNames[bii2[1].intValue()];
            number = number.divide(bi3);

            veryFar = tensNames[bii2[1].intValue()] + veryFar;
            number = number.divide(bi3);
        }
        if (number.compareTo(BigInteger.valueOf(0)) == 0)
            return veryFar;
            return numNames[number.intValue()] + " hundred" + veryFar;
    }

        public static String convert (BigInteger number){
            // 0 to 999 999 999 999
            if (number.compareTo(BigInteger.valueOf(0)) == 0) {
                return "zero";
            }

            String snumber = number.toString();

            // pad with "0"
            String mask = "000000000000";
            DecimalFormat df = new DecimalFormat(mask);
            snumber = df.format(number);

            BigInteger trillions = new BigInteger(snumber.substring(0, 3));
            // nnnXXXnnnnnnnnn
            BigInteger billions = new BigInteger(snumber.substring(3, 6));
            // nnnnnnXXXnnnnnn
            BigInteger millions = new BigInteger(snumber.substring(6, 9));
            // nnnnnnnnnXXXnnn
            BigInteger hundredThousands = new BigInteger(snumber.substring(9, 12));
            // nnnnnnnnnnnnXXX
            BigInteger thousands = new BigInteger(snumber.substring(12, 15));

            String tradTrillions;
            if (trillions.compareTo(BigInteger.valueOf(0)) == 0) {
                tradTrillions = "";
            } else if (trillions.compareTo(BigInteger.valueOf(1)) == 0) {
                tradTrillions = convertLessThanOneThousand(trillions) + " trillion ";
            } else {
                tradTrillions = convertLessThanOneThousand(trillions) + " trillion ";
            }

            String result = tradTrillions;

            String tradBillions;
            if (billions.compareTo(BigInteger.valueOf(0)) == 0) {
                tradBillions = "";
            } else if (billions.compareTo(BigInteger.valueOf(1)) == 0) {
                tradBillions = convertLessThanOneThousand(billions) + " billion ";
            } else {

                tradBillions = convertLessThanOneThousand(billions) + " billion ";
            }
            result = result + tradBillions;

            String tradMillions;
            if (millions.compareTo(BigInteger.valueOf(0)) == 0) {
                tradMillions = "";
            } else if (millions.compareTo(BigInteger.valueOf(1)) == 0) {
                tradMillions = convertLessThanOneThousand(millions) + " million ";
            } else {

                tradMillions = convertLessThanOneThousand(millions) + " million ";
            }
            result = result + tradMillions;

            String tradHundredThousands;
            if (hundredThousands.compareTo(BigInteger.valueOf(0)) == 0) {
                tradHundredThousands = "";
            } else if (hundredThousands.compareTo(BigInteger.valueOf(1)) == 0) {

                tradHundredThousands = "one thousand ";
            } else {
                tradHundredThousands = convertLessThanOneThousand(hundredThousands) + " thousand ";
            }
            result = result + tradHundredThousands;

            String tradThousand;
            tradThousand = convertLessThanOneThousand(thousands);
            result = result + tradThousand;

            // remove extra spaces!
            return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");
        }

}

<pre lang="text">


Что я уже пробовал:

Я попытался добавить пустое пространство в начало массива tensname.Я использовал отладчик, он показал мне, что триллионы, миллиарды, миллионы и сотни тысяч были назначены в 12-значном числе, когда была установлена точка останова на тысячах.Это должно было быть на 1 ступень ниже.Что я должен сделать, чтобы исправить это

CPallini

Это не полный код, вы не показываете, как вы его вызываете.

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я сделал приложение для преобразования цифр в текст, но оно просто вылетает, если я ввожу меньше этого 15-значного числа.Он также показывает следующие десятки мест, где он должен быть.Если я введу больше, чем 15 цифр, то это займет только первые 15, в то время как он ничего не должен делать

Отображение сообщения об ошибке и позиции может помочь найти, в чем заключается проблема.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


DemonCoderadd

Я использовал отладчик, он показал мне, что триллионы, миллиарды, миллионы и сотни тысяч были назначены в 12-значном числе, когда была установлена точка останова на тысячах.Это должно было быть на 1 ступень ниже.Что я должен сделать, чтобы исправить это

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Рейтинг:
0

Richard MacCutchan

Используйте отладчик, чтобы проверить, сколько символов вы получаете snumber = df.format(number); Если он меньше 15, то код потерпит неудачу в тот момент, когда вы попытаетесь получить подстроку за концом.


DemonCoderadd

Я не понял, что ты сказал?

Richard MacCutchan

Посмотрите на свой код: вы используете snumber = df.format(number); чтобы преобразовать число в строку. Затем вы пытаетесь извлечь из него пять подстрок, каждая из трех символов. Но если исходная строка имеет длину менее пятнадцати символов, код завершится ошибкой при одном из вызовов подстроки. Вы можете проверить это, используя отладчик для пошагового просмотра кода и изучения переменных.