"지능형"은 두 개의 다른 형식의 문자열에서 두 배에서 두 개의 다른 형식의 문자열을 캐스트합니까?

StackOverflow https://stackoverflow.com/questions/1635821

문제

나는 한계가있는 데이터베이스로 작업하고 있습니다. (숫자) 데이터 유형 만 보관할 수 있습니다 더블. 내가하고 싶은 것은 특정 행의 번호를 선택하여 HTTP 요청에 넣는 것입니다. 문제는이 숫자에 소수성이 없어야하는지 또는 안된다는 것을 알 수 없다는 점에서 문제가 발생합니다.

예를 들어, 더블이 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라고 가정하지 않으면 좋을 것입니다. 예를 들어,지도를 표시하는 사이트를 쿼리하고 숫자가 좌표 인 경우 소수점이 매우 중요한 곳은 어디입니까? 그런 다음 긴 캐스트는 더 이상 허용되지 않습니다.

요컨대;

  • 더블에 소수점이없는 경우, 트레일 링 소수점을 추가하지 마십시오.
  • 소수성이 있다면 모두 유지하십시오.
  • 어떤 경우에도 과학적 표기법이나 천천 개의 분리기가 있어야합니다.

이 솔루션은 C#과 Java 모두로 포팅되므로 두 언어로 답변을받습니다. (아, 그리고이 질문을 무엇이라고 부를지 전혀 몰랐습니다. 더 나은 것을 얻었다면 이름을 자유롭게 바꾸십시오.)

도움이 되었습니까?

해결책 6

그녀는 내 자신의 결론 :

  • 더블에 소수점이 있는지 확인하십시오.
  • 그것에 따라 그에 따라 문자열을 형식으로 형식화하십시오.
  • 그리고 중요한 것; 변하지 않는 문화를 지정하지 않으면 서, 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);
        }
    }
    

다른 팁

Gustafc의 답변을 보완하기 위해 (1 분이 나를 이겼습니다) C#의 관련 코드 라인은 다음과 같습니다.

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

또는

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

ID 또는 좌표를 나타내는 경우 (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")
}

사용자 정의 유형에서 숫자를 캡슐화하는 것은 어떻습니까?

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 답변을 참조하십시오.

num == round (num) 여부 확인

Java에서는이 작업을 수행 할 수 있습니다 십진법.

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

그만큼 # 자리 표시자는 제로가 아닌 다른 번호가 없으면 나타나지 않으며, 소수점이 뒤 따르는 것이 없다면 소수점이 나타나지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top