“智能”演员的两到两个不同格式的字符串?

时间:2009-10-28 08:20:57

标签: c# java string format format-string

我正在使用一个数据库,该数据库的限制是它可以存储的唯一(数值)数据类型 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

解决方法是将其强制转换为。忽略了长时间溢出的问题,它解决了科学记数法和(显然)尾随小数。这可能是一个可以接受的解决方案,但如果代码不认为它是我们正在处理的ID,那将是很好的。例如,如果我查询显示地图的网站并且数字是坐标,小数位数非常重要?那么强制转换为长期不再可接受。

总之;

  • 如果double没有小数,请不要添加尾随小数。
  • 如果它有小数,请保留所有小数。
  • 两种情况都不应该有科学记数法或千位分隔符。

此解决方案将移植到C#和Java,因此我接受两种语言的答案。 (哦,我不知道该怎么称呼这个问题,如果你有更好的东西,请随意重命名。)

6 个答案:

答案 0 :(得分:3)

为了补充gustafc(谁打败了我1分钟)的答案,这里是C#的相关代码行:

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

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

答案 1 :(得分: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")
}

答案 2 :(得分: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的答案,以获得比上述算法更好的算法。

答案 3 :(得分:0)

检查num == round(num)

答案 4 :(得分:0)

在Java中,您可以使用DecimalFormat执行此操作。

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

#占位符不会显示,除非将零以外的数字放在那里,并且小数点不会显示,除非有跟随它的内容。

答案 5 :(得分:0)

继承我自己的结论:

  • Check if the double has decimals.
  • Depending on that, format the string accordingly.
  • 然后重要的事情;在没有指定不变文化的情况下,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);
        }
    }