1

保存できる唯一の(数値)データ型がdoubleであるという制限があるデータベースを使用しています。私がやりたいことは、特定の行の番号を選択して、HTTP 要求に入れることです。問題は、この数値に小数があるべきかどうかわからないということです。

たとえば、double が ID の場合、HTTP 要求を受け取るサイトが混乱するため、どのような書式設定もできません。次の例に注意してください。

site.com/showid.php?id=12300000 // OK
site.com/showid.php?id=1.23E7 // Bad; scientific notation
site.com/showid.php?id=12300000.0 // Bad; trailing decimal

これに対する解決策は、 long にキャストすることです。long のオーバーフローの問題を無視して、科学表記法と (明らかに) 末尾の 10 進数を解決します。これは容認できる解決策ですが、コードが、それが私たちが扱っている ID であると想定していない場合は良いでしょう。たとえば、地図を表示するサイトにクエリを実行し、数値が座標であり、小数が非常に重要である場合はどうなるでしょうか? その場合、 long へのキャストは受け入れられなくなります。

要するに;

  • double に小数がない場合は、末尾に小数を追加しないでください。
  • 小数がある場合は、すべて保持します。
  • どちらの場合も、科学表記法や千単位の区切り記号を使用しないでください。

このソリューションは C# と Java の両方に移植されるため、両方の言語で回答を受け入れます。(ああ、私はこの質問を何と呼ぶべきかわかりませんでした。もっと良いものがあれば、自由に名前を変更してください。)

4

6 に答える 6

3

gustafc の回答 (1 分で私を打ち負かした人) を補足するために、C# に関連するコード行を次に示します。

MyDouble.ToString("0.################")

また

string.Format("{0:0.################}", MyDouble);
于 2009-10-28T08:53:29.403 に答える
2

値が整数である場合 (ID を表すか座標を表すかに関係なく)、末尾にゼロを付けずに値をフォーマットしても安全なので、箇条書きで説明するロジックをコード化してみませんか? 例 (C# ですが、すぐに Java に変換できるはずです):

// Could also use Math.Floor, etc., to determine if it is integral
long integralPart = (long)doubleValue;
if ((double)integralPart == doubleValue)
{
  // has no decimals: format it as an integer e.g. integralPart.ToString("D") in C#
}
else
{
  // has decimals: keep them all e.g. doubleValue.ToString("F17")
}
于 2009-10-28T08:31:28.420 に答える
1

数値をカスタム型にカプセル化するのはどうですか?

public class IntelligentNumber
{
    private readonly double number;

    public IntelligentNumber(double number)
    {
        this.number = number;
    }

    public override string ToString()
    {
        long integralPart = (long)this.number;
        if((double)integralPart == this.number)
        {
            return integralPart.ToString();
        }
        else
        {
            return this.number.ToString();
        }
    }
}

上記よりも優れたアルゴリズムについては、Vilx-'s answer も参照してください。

于 2009-10-28T08:39:17.673 に答える
0

Java では、これをDecimalFormatで行うことができます。

static String format(double n) { 
    return new DecimalFormat("0.###########################").format(n); 
}

プレースホルダーは、#そこにゼロ以外の数値を入力しない限り表示されず、小数点はそれに続くものがない限り表示されません。

于 2009-10-28T08:51:23.920 に答える
0

num == round(num) かどうかを確認します

于 2009-10-28T08:33:19.417 に答える
0

私自身の結論は次のとおりです。

  • double に小数があるかどうかを確認します。
  • それに応じて、文字列を適切にフォーマットします。
  • そして、重要なことがあります。インバリアント カルチャを指定しない場合、has-decimals ケースのコンマは、「.」ではなく「,」になる場合があります。これは HTTP リクエストでは好まれません。もちろん、この問題は、OS がコンマを優先するロケールに設定されている場合にのみ発生します。

    public static string DoubleToStringFormat(double dval)
    {
        long lval = (long)dval;
        if ((double)lval == dval)
        {
            // has no decimals: format as integer
            return dval.ToString("#.", CultureInfo.InvariantCulture);
        }
        else
        {
            // has decimals: keep them all
            return dval.ToString("0.##################", CultureInfo.InvariantCulture);
        }
    }
    
于 2009-10-28T09:22:27.677 に答える