簡體   English   中英

如何將數字轉換為以十萬而不是一千為單位的錯誤輸出

[英]How to convert number to words wrong output in lakh and not thousand

我正在創建一個將數字轉換為單詞的程序。該程序運行良好,但是在“ 100500”給出錯誤的輸出而不是“一百五十萬”的情況下,其顯示為“十萬五千”。 程序如下

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.text.DecimalFormat;
 public class CheckRupees {

 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(int number) {
    String soFar;

   if (number % 100 < 20){
   soFar = numNames[number % 100];
   number /= 100;
   }
   else {
    soFar = numNames[number % 10];
   number /= 10;

  soFar = tensNames[number % 10] + soFar;
  number /= 10;
   }
   if (number == 0) return soFar;
   return numNames[number] + " hundred" + soFar;
  }

    private static String convertLessThanOneThousandForLakhs(int number) {
     String soFar;
     if (number % 100 < 20){
      soFar = numNames[number % 100];
      number /= 100;
        }
        else {
        soFar = numNames[number % 10];
        number /= 10;

        soFar = tensNames[number % 10] + soFar;
        number /= 10;
        }
        if (number == 0) return soFar;
       {
      return numNames[number] + " lakh" + soFar;

      }
     }

     public static String convert(long number) {
     // 0 to 999 999 999 999
     if (number == 0) { return "zero"; }

     String snumber = Long.toString(number);

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

     // XXXnnnnnnnnn
     int billions = Integer.parseInt(snumber.substring(0,3));
     // nnnXXXnnnnnn
     int millions  = Integer.parseInt(snumber.substring(3,6));
     // nnnnnnXXXnnn
     int hundredThousands = Integer.parseInt(snumber.substring(6,9));
     // nnnnnnnnnXXX
     int thousands = Integer.parseInt(snumber.substring(9,12));

     String tradBillions;
     switch (billions) {
     case 0:
     tradBillions = "";
     break;
     case 1 :
     tradBillions = convertLessThanOneThousand(billions)
      + " billion ";
    break;
  default :
  tradBillions = convertLessThanOneThousand(billions)
  + " billion ";
   }
 String result =  tradBillions;

  String tradMillions;
 switch (millions) {
  case 0:
  tradMillions = "";
  break;
  case 1 :
  tradMillions = convertLessThanOneThousand(millions)
     + " million ";
   break;
   default :
   tradMillions = convertLessThanOneThousand(millions)
     + " million ";
  }
  result =  result + tradMillions;

 String tradHundredThousands;
 switch (hundredThousands) {
 case 0:
  tradHundredThousands = "";
  break;
  case 1 :
  tradHundredThousands = "one thousand ";
  break;
  default :
  tradHundredThousands =     convertLessThanOneThousandForLakhs(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", " ");

}


 public static void main(String[] args) {


  int xValue=200500;
    System.out.println(CheckRupees.convert(xValue));
  } 
}

您應該以更結構化的方式實現您的操作,而不是為每個名稱創建一個特殊的情況。 此外,當Java具有數值比較運算符時,使用格式和子字符串運算的這些組合毫無意義。

例如

private static final String[] LARGE_NAMES = {
        "billion",  "million",   "lakh", "thousand", "hundred"
};
private static final int[] LARGE_FACTORS = {
    1_000_000_000,  1_000_000,  100_000,      1_000,       100
};
private static final String[] TENS_NAMES = {
    "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
};
private static final String[] SMALL_NAMES = {
    "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
    "eleven", "twelve", "thirteen", "fourteen", "fifteen",
    "sixteen", "seventeen", "eighteen", "nineteen"
};
public static String toName(int number) {
    return number==0? "zero": appendName(number, new StringBuilder()).toString();
}

private static StringBuilder appendName(int number, StringBuilder sb) {
    if(number >= LARGE_FACTORS[LARGE_FACTORS.length-1]) {
        for(int i = 0; i < LARGE_FACTORS.length; i++) {
            int f = LARGE_FACTORS[i];
            if(number >= f) {
                int quantity = number/f;
                appendName(quantity, sb).append(' ').append(LARGE_NAMES[i]);
                number -= quantity*f;
            }
        }
    }
    if(number>0) {
        if(sb.length()>0) sb.append(' ');
        if(number>SMALL_NAMES.length) {
            int tenth = number/10;
            sb.append(TENS_NAMES[tenth-1]);
            number -= tenth*10;
            if(number == 0) return sb;
            sb.append(' ');
        }
        sb.append(SMALL_NAMES[number-1]);
    }
    return sb;
}

此行為您的輸入值添加了“千”:

    default:
        tradHundredThousands = convertLessThanOneThousandForLakhs(hundredThousands)
                + " thousand";

您可以通過在變量hundredThousands上再添加一個條件來解決此hundredThousands 並且僅當hundredThousands小於100時才添加“千”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM