"지능형"은 두 개의 다른 형식의 문자열에서 두 배에서 두 개의 다른 형식의 문자열을 캐스트합니까?
-
06-07-2019 - |
문제
나는 한계가있는 데이터베이스로 작업하고 있습니다. (숫자) 데이터 유형 만 보관할 수 있습니다 더블. 내가하고 싶은 것은 특정 행의 번호를 선택하여 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);
}
그만큼 #
자리 표시자는 제로가 아닌 다른 번호가 없으면 나타나지 않으며, 소수점이 뒤 따르는 것이 없다면 소수점이 나타나지 않습니다.