0

parse double や math、int、または double 関数を使用せずに、文字列を double に変換するように指示されています。指数を使用して数値を変換するのに苦労しています。

public class Convert {

    public static void main(String args[]) {
        String num = "1223.230";
        int d = 0, g = 0, c = 0, fnl = 0;
        int exp = (num.indexOf(".") - 1);
        while (num.charAt(d) != '.') {
            g = num.charAt(d) - 48;
            int k = 1;
            for (int f = 0; f < exp; f++) {
                k = (k * 10) * g;
            }
            fnl += k;
            d++;
            exp--;
            System.out.println(fnl);                
        }   
    }

}

これらのコードは、指定された文字列の int 部分のみを変換し、間違った答えを出力します。

4

4 に答える 4

2

「.」で分割し、左側をループして次の文字桁を取得し、既存の値が 0 より大きい場合は 10 を掛けてから、読み取った桁を追加します (スイッチ/ケースを使用)。左に数を増やしてしまうことになります。

次に、「.」の右側を処理します。右から左に移動して同じことを行いますが、今回は 10 で割り、数字/10 を追加します。小数を右に大きくします。

最後に、左側を取り、右側に追加します。

于 2013-09-13T13:56:37.030 に答える
0

これがオラクルのやり方です:)

http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#valueOf(java.lang.String)

final String Digits     = "(\\p{Digit}+)";
final String HexDigits  = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally 
// signed decimal integer.
final String Exp        = "[eE][+-]?"+Digits;
final String fpRegex    =
            ("[\\x00-\\x20]*"+  // Optional leading "whitespace"
             "[+-]?(" + // Optional sign character
             "NaN|" +           // "NaN" string
             "Infinity|" +      // "Infinity" string

// A decimal floating-point string representing a finite positive
// number without a leading sign has at most five basic pieces:
// Digits . Digits ExponentPart FloatTypeSuffix
// 
// Since this method allows integer-only strings as input
// in addition to strings of floating-point literals, the
// two sub-patterns below are simplifications of the grammar
// productions from the Java Language Specification, 2nd 
// edition, section 3.10.2.

// Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
             "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+

// . Digits ExponentPart_opt FloatTypeSuffix_opt
             "(\\.("+Digits+")("+Exp+")?)|"+

// Hexadecimal strings
       "((" +
// 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "(\\.)?)|" +

// 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +

        ")[pP][+-]?" + Digits + "))" +
             "[fFdD]?))" +
             "[\\x00-\\x20]*");// Optional trailing "whitespace"

if (Pattern.matches(fpRegex, myString))
    Double.valueOf(myString); // Will not throw NumberFormatException
else
{
    // Perform suitable alternative action
}

他の正規表現パターンを調べて実行したい場合は、たくさんあります。

編集:

パターンのきれいなバージョン:)

private static final Pattern DOUBLE_PATTERN = Pattern
        .compile("[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)"
            + "|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)"
            + "?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
于 2013-09-13T13:56:32.170 に答える
0

これは、実際には手動で行うことはないので、問題解決の練習にすぎません。面接で聞かれる可能性が高いです。したがって、上記の CodeChimp も説明したように、古き良き単位、10、100 を使用し、整数側で乗算し、10 進数側で除算するのが最善の方法です。

 public double convertStrToDouble(String doubleAsString) {
    final String[] split = doubleAsString.split("\\."); // 123.375
    int intPart = 0;
    final String intPartStr = split[0]; // 123
    final String decPartStr = split[1]; // 375
    // (1 * 3) + (2 * 10) + (3 * 100) = 123
    int units = 1;
    for(int i = intPartStr.length()-1; i >= 0; i--) {
        char nChar = intPartStr.charAt(i);
        int n = Character.getNumericValue(nChar);
        int toAdd =  n * units;
        intPart = intPart + toAdd;
        System.out.printf("int: n %,5d toAdd %,5d intPart %,5d units %,5d\n",n,toAdd,intPart,units);
        units =  units * 10;
    }
    System.out.println("");
    // double part 375
    // (1 / 10) * 3 + (1 / 100) * 7 + (1 /1000) * 5
    // 0.3 + 0.07 + 0.005 = 0.375
    double decPart = 0d;
    units = 10;
    for(final char character : decPartStr.toCharArray()) {
        int n = Character.getNumericValue(character);
        double toAdd = (1.0 / units) * n;
        decPart = decPart + toAdd;
        System.out.printf("dec: n %,5d toAdd %,5.4f decPart %,5.4f units 1/%d\n",n,toAdd,decPart,units);
        units =  units * 10;
    }
    System.out.printf("returning %,4d + %,4.4f\n\n",intPart,decPart);
    return  intPart  + decPart;
}
于 2020-07-30T07:57:21.750 に答える