سؤال

أنا أعمل مع قاعدة بيانات لها الحد الأقصى لـ نوع البيانات (الرقمي) فقط يمكن تخزينه مزدوج.ما أريد فعله هو اختيار الرقم لصف معين ووضعه في طلب HTTP.تدور المشكلة حول أنني لا أستطيع معرفة ما إذا كان هذا الرقم يجب أن يحتوي على أرقام عشرية أم لا.

على سبيل المثال، إذا كان المضاعف عبارة عن معرف، فلا يمكنني الحصول على أي نوع من التنسيق على الإطلاق، نظرًا لأن الموقع الذي يحصل على المعرف طلب 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

الحل لهذا سيكون يلقيها لفترة طويلة.بتجاهل مشكلة فيضان الطول، فإنه يحل التدوين العلمي والعلامة العشرية اللاحقة (بشكل واضح).قد يكون هذا حلاً مقبولاً ولكن سيكون من الجيد ألا يفترض الكود أنها معرفات كنا نتعامل معها.ماذا لو، على سبيل المثال، كنت سأستفسر عن موقع يعرض خريطة والرقم عبارة عن إحداثيات، حيث الكسور العشرية مهمة جدا؟ ثم لم يعد الإلقاء لفترة طويلة مقبولاً.

باختصار؛

  • إذا لم يكن للرقم المزدوج أرقام عشرية، فلا تقم بإضافة علامة عشرية زائدة.
  • إذا كان به أعداد عشرية، احتفظ بها كلها.
  • ولا ينبغي أن تحتوي أي من الحالتين على علامة علمية أو ألف فاصل.

سيتم نقل هذا الحل إلى كل من C# وJava لذا أقبل الإجابات باللغتين.(أوه، ولم تكن لدي أي فكرة عما أسميه هذا السؤال، فلا تتردد في إعادة تسميته إذا كان لديك شيء أفضل.)

هل كانت مفيدة؟

المحلول 6

هذا هو استنتاجي الخاص:

  • تحقق مما إذا كان الزوج يحتوي على أرقام عشرية.
  • بناءً على ذلك، قم بتنسيق السلسلة وفقًا لذلك.
  • وبعدها شيء مهم؛دون تحديد ثقافة ثابتة ، قد تكون الفاصلة في قضية Has-Decimals "، بدلاً من". الذي لا يحبها طلبات HTTP.بالطبع، تظهر هذه المشكلة فقط إذا تم ضبط نظام التشغيل لديك على لغة تفضل الفاصلة.

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

نصائح أخرى

لاستكمال إجابة gustafc (الذي سبقني بدقيقة واحدة)، إليك سطر التعليمات البرمجية ذي الصلة بـ C#:

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

أو

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

نظرًا لأنه من الآمن تنسيق القيمة بدون أصفار زائدة إذا كانت متكاملة (سواء كانت تمثل معرفًا أو إحداثيًا)، فلماذا لا تقوم فقط بتدوين المنطق الذي تصفه في النقاط النقطية الخاصة بك؟على سبيل المثال (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")
}

ماذا عن تغليف الرقم في نوع مخصص؟

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- للحصول على خوارزمية أفضل من تلك المذكورة أعلاه.

تحقق مما إذا كان num == round(num)

في جافا، يمكنك القيام بذلك باستخدام تنسيق عشري.

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

ال # لن تظهر العناصر النائبة إلا إذا كان الرقم مختلفًا عن الأصفار التي سيتم وضعها هناك، ولا تظهر العلامة العشرية إلا إذا كان هناك شيء يتبعها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top