2009-10-21 4 views
3

나는 바보 같은 질문이 없다는 말에 의존 할 것이지만, 나는 약간 멍청한 질문을한다.지수 표기법으로 숫자가 표시되지 않도록하는 더 쉬운 방법

편집 :

이 질문은 질문과 중복을 검색 할 때 내가 건너하지 않은 제목을 사용하지만, 이미 여기에 몇 번 답 것 같다. 여기에 몇 가지 관련 게시물은 다음과 같습니다

  1. Double to string conversion without scientific notation
  2. How to convert double to string without the power to 10 representation (E-05)
  3. 장소에 대한 답변 (존 소총)과 : http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

원래 질문 : '

일부 앱에 시간에는 0.000023425과 같이 약간 작은 숫자가 저장됩니다. 이 숫자는 사용자가 편집 할 수 있도록 TextBox 컨트롤에로드됩니다. 다음 인위적인 예는 내 문제를 보여줍니다 언급 한 바와 같이

Dim number As Double = 0.000023425 
someTextBox.Text = number.ToString() ' Shows "2.3425E-05" 

이 표시 텍스트가 2.3425E-05이며, 사용자가 볼 수 있도록 정확하게 직관적이지 플러스, 나는 19 소수점 이하 자릿수를 (더 정확한 번호를). 출력을 고정 소수점으로하고 싶습니다. 물론 쉽고 깨끗하게 처리 할 수 ​​있습니다.

number.ToString("F20") ' Shows "0.00002342500000000000" 

하지만 그때 귀찮은 수의 0이 남아 있습니다. 그래서, 그 문제를 해결하기 위해 내가 할 수있는 :

number.ToString("#,##0.####################") ' Shows "0.000023425" 

을 내가 원하는,하지만 거기 거대한 추한 형식 문자열을 가지고하는 것보다 그것을 할 수있는 더 좋은 방법이 무엇입니까? 그래, 그게 못생긴 것은 아니지만 확실히 다른 방법이있어, 그렇지? 내 목표는 DB에 친숙한 방식으로 저장되는 원시 값을 표시하는 것이며, 숫자에 형식을 적용하지 않아도됩니다.

감사합니다.

UPDATE 아마도 나는 게시물에 조금 너무 많이했다. 몇 가지 실험을 거쳐 기본 데이터 유형을 Decimal으로 변경하면 문제가 해결된다는 사실을 발견했습니다. Double의 일반적 표시 할만큼 정확하지처럼

Dim number As Decimal = 0.000023425 
someTextBox.Text = number.ToString() ' Shows "0.000023425" instead of "2.3425E-05" 

는 그래서 소리?

편집

나는 단순히 원하는 효과를 가지고 그것에 .ToString()을하기 전에 진수로 더블 값을 캐스팅 found a post (NO upvotes와이기는하지만). 왜 내가 그걸하고 싶지 않은 이유가 있니? 아마도 Decimal의 캐스트는 Double과 다른 값으로 끝날 가능성이 있습니다 (무시할만한 양이지만) #,##0.#################... 형식 문자열이 더 안전합니다.

+0

http : //stackoverflow.com/questions/1546113/double-to-string-conversion-without-scientific-notation을 살펴보십시오. Jon Skeet의 유틸리티 클래스는 유망 해 보입니다. – RichardOD

+0

오, 그리고 BTW- 이것은 확실히 바보 같은 질문이 아닙니다! – RichardOD

+0

@RichardOD : Jon의 유틸리티 클래스는 과도한 것으로 보이지만 정확히 내가 원하는 솔루션입니다. 난 정말 19 + 정밀도의 숫자가 필요하지 않으며, 데이터베이스는 어쨌든 정밀도에서 두 배보다 큰 것을 취할 수 없습니다 (도 필요하지 않습니다). 당신이 당신의 코멘트를 대답으로 바꾸면 저는 그것을 기꺼이 대답으로 받아 들일 것입니다. –

답변

3

서식 문자열을 상수 (예 : 리소스 파일)로 만들고 이름으로 사용하십시오. 추악한 형식을 보지 않고 형식에서 제어하기 위해 일관성을 유지합니다 (즉, 마음이 바뀌면 모든 컨트롤이 새로운 모양을 얻습니다).

대안으로 (또는 함께) 텍스트 상자에서 사용자 지정 컨트롤을 파생시키고 더 쉬운 구문에서 사용할 다른 서식 지정 문자열을 호출하는 속성을 가질 수 있습니다.

어느 쪽이든 당신의 목표는 반복해서는 안됩니다 ... 한 곳에서 구성을 잘못 배치하면 결국 잘못 입력하는 것을 피하고 이상한 서식 버그를 추적하지 않아도됩니다.

모든 서식 지정 및 구문 분석 요구 사항을 캡슐화하는 "퍼센트"및 "통화"텍스트 컨트롤을 만들어 비슷한 작업을 수행합니다. 그렇지 않으면 텍스트 컨트롤과 똑같이 작동합니다.

+0

내 게시물에서 내 __update__ 및 __edit__을 참조하십시오. –

+0

분명히 당신이 발견 한 것이 더 간단합니다. Double은 Decimal ("이진 반올림 문제없이 십진 통화 금액을 처리하기 위해 설계된)" "정밀"하지 않습니다. 디스플레이에만 캐스트하는 경우 대부분의 경우 작동 할 것으로 판단됩니다. 그러나 1.0 대신 0.9999999 형식 결과를 얻는 계산을 수행하면 double이 문제가됩니다. 이것이 문제가되지 않는다면, 캐스트로 충분할 것입니다. 그래도 "퍼센트"와 "통화"전용 컨트롤을 사용하면 많은 추측과 중복이 발생합니다. – Godeke

+0

"왜"질문에 대답하려면 ... 기본 서식 지정자 (ToString()이 사용하는 것입니다)가 상당히 좁은 범위 밖에서 과학에 적용됩니다. 그렇기 때문에 원하는 것을 얻기 위해 명시적인 형식을 사용해야합니다. 실제로 한 가지를 다른 것으로 변환하지는 않지만, 같은 것을 다른 출력으로 표현한 것입니다. – Godeke

관련 문제