Frage

ich mit einer Datenbank gerade arbeite, die die Grenze hat, dass der nur (numerisch) Datentyp es speichern kann, ist ein Doppel . Was ich tun möchte, ist die Zahl für eine bestimmte Zeile auswählen und sie in eine HTTP-Anforderung gestellt. Das Problem dreht sich um, dass ich nicht wissen, ob diese Zahl soll oder nicht Dezimalstellen hat.

Zum Beispiel, wenn die Doppel eine ID ist, kann ich jede Art von Formatierung nicht auch immer, da der Website, die die HTTP-Anforderung wird verwechselt wird. Beachten Sie die folgenden Beispiele:

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

Die Lösung dieses Problem sein würde wirft es auf einem langen . Ignoriert das Problem der langen überfüllt, löst es die wissenschaftliche Notation und (natürlich) Hinter dezimal. Dies könnte eine akzeptable Lösung sein, aber es wäre schön, wenn der Code nicht annehmen, dass es IDs waren wir es zu tun hatten. Was passiert, wenn zum Beispiel war ich eine Website abzufragen, die eine Karte und die Zahl zeigt, sind Koordinaten, , wo die Dezimalzahlen sind sehr wichtig? Dann wird ein Guss zu lange nicht mehr akzeptabel ist.

Kurz gesagt;

  • Wenn die Doppel keine Dezimalstellen hat, fügen Sie nicht eine Hinter dezimal.
  • Wenn es Dezimalstellen hat, halten sie alle.
  • sollten Weder Fall wissenschaftliche Schreibweise oder Tausendertrennzeichen haben.

wird diese Lösung sowohl für C # portiert werden und Java so akzeptiere ich Antworten in beiden Sprachen. (Oh, und ich hatte keine Ahnung, was diese Frage zu stellen, umbenennen frei fühlen, wenn Sie etwas besser.)

War es hilfreich?

Lösung 6

Heres meine eigene Schlussfolgerung:

  • Überprüfen Sie, ob die Doppel Dezimalstellen hat.
  • auf, dass je nach Formatierung der Zeichenfolge entsprechend.
  • Und dann etwas Wichtiges; ohne eine invariante Kultur zu spezifizieren, das Komma in dem HAS-Dezimalzahlen Fall kann eine sein „“ statt einem „“ die von HTTP-Anfragen gern isnt. Natürlich nur dieses Problem taucht auf, wenn Ihr Betriebssystem auf ein Gebietsschema festgelegt ist, dass das Komma vorzieht.

    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);
        }
    }
    

Andere Tipps

die Antwort von gustafc Zur Ergänzung (die mich um 1 Minute schlagen), hier ist die entsprechende Code Zeile für C #:

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

oder

string.Format("{0:0.################}", MyDouble);

Da es sicher ist, den Wert ohne hintere Nullen formatiert werden, wenn sie integriert ist (ob es eine ID oder eine Koordinate darstellt), warum kodifizieren nicht nur die Logik, die Sie in Ihren Aufzählungszeichen beschreiben? Zum Beispiel (C #, sollte aber leicht zu Java übersetzen):

// 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")
}

Wie wäre es, die Anzahl in einem benutzerdefinierten Typ Einkapseln?

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();
        }
    }
}

Siehe auch die Antwort von Vilx-für einen besseren Algorithmus als zuvor.

prüfen, ob num == round (num)

In Java können Sie tun dies mit DecimalFormat .

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

Der # Platzhalter wird nicht angezeigt, es sei denn, die Zahl etwas anderes als Nullen dort zu setzen, und der Dezimalpunkt nicht angezeigt, es sei denn es ist etwas folgende da ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top