Vra

Ek is besig met 'n databasis wat die beperking dat die net (numeriese) data type dit kan stoor het 'n dubbel . Wat ek wil doen, is kies die nommer vir 'n sekere ry en sit dit in 'n HTTP-versoek. Die probleem wentel om wat ek nie kan weet of hierdie nommer moet of moet nie desimale het.

Byvoorbeeld, as die dubbele is 'n ID, ek kan nie enige soort van formaat ook al, sedert die terrein wat die HTTP-versoek sal verwar word. Kyk na die volgende voorbeelde:

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 oplossing vir hierdie sou wees om gooi dit na 'n lang . Ignoreer die probleem van oorvol die lang, dit los die wetenskaplike notasie en (natuurlik) sleep desimale. Dit kan 'n aanvaarbare oplossing wees, maar dit sal lekker wees as die kode nie aanvaar dit was ID's ons te doen gehad het met. Wat gebeur as, byvoorbeeld, ek was om 'n webwerf wat toon navraag 'n kaart en die aantal is koördinate, waar die desimale baie belangrik? Dan is 'n cast lank nie meer aanvaarbaar nie.

In kort,

  • As die dubbele het geen desimale, nie 'n sleep desimale voeg.
  • As dit desimale, hou hulle almal.
  • Nóg geval moet wetenskaplike notasie of duisend skeiers het.

Hierdie oplossing sal oorgedra word na beide C # en Java so ek aanvaar antwoorde in beide tale. (O ja, en ek het geen idee gehad wat om hierdie vraag te noem, voel vry om te hernoem as jy iets beter geword het.)

Was dit nuttig?

Oplossing 6

Hier is my eie gevolgtrekking:

  • Kyk of die dubbele het desimale.
  • Afhangende van wat, formateer die string dienooreenkomstig.
  • En dan is daar iets belangrik; sonder vermelding van 'n invariante kultuur, kan die komma in die het-desimale geval 'n "," in plaas van 'n "." wat isnt graag deur HTTP-versoek. Natuurlik, hierdie probleem opduik slegs as jou OS is ingestel op 'n land wat die komma verkies.

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

Ander wenke

Om die antwoord van gustafc (wat my klop met 1 minuut), hier is die relevante kode lyn vir C # vul:

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

of

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

Aangesien dit veilig is om die waarde formaat met geen sleep nulle as dit 'n integrale deel (of dit 'n ID of 'n koördineer verteenwoordig), waarom nie net kodifiseer die logika wat jy beskryf in jou koeël punte? Byvoorbeeld (C #, maar moet geredelik vertaal na 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")
}

Hoe gaan dit vat die aantal in 'n persoonlike tipe?

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

Sien ook Vilx-se antwoord vir 'n beter algoritme as die een hierbo.

kyk of num == ronde (NUM)

In Java, kan jy dit doen met DecimalFormat .

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

Die # plekhouers sal nie opdaag nie, tensy die getal iets anders as nulle om daar te sit, en die desimale punt nie opdaag nie, tensy daar is iets wat daarop volg.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top