2017-03-22 19 views
1

我正在創建一個程序,將數字轉換爲單詞。該程序工作正常,但在「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)); 
    } 
} 
+1

的可能的複製[什麼是調試器以及它如何幫助我診斷問題?(http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can - 它幫助我診斷問題) – aUserHimself

+0

它現在工作,增加結果= result.replaceAll(「十萬」,「十萬」); –

+2

您應該通過修復問題來解決問題,而不是添加試圖隱藏症狀的後處理代碼。 – Holger

回答

0

此行加入「千」爲您的輸入值:

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

您可以通過可變hundredThousands增加一個條件解決它。並且僅在hundredThousands小於100時添加'千'

2

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

E.g.

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; 
} 
相關問題