2012-05-02 6 views
2

내 GWT 웹 응용 프로그램에는 가격을 보유하고있는 텍스트 상자가 있습니다. 어떻게 그 문자열을 BigDecimal로 변환 할 수 있습니까?GWT에서 문자열을 BigDecimal로 변환

+0

내가 GWT에 익숙하지 오전하지만 자바에서 그냥 쓰기 :'BigDecimal의 BD = 새로운 BigDecimal를 (yourString)'. – assylias

+0

[Safe String to BigDecimal conversion] 가능한 복제본 (http://stackoverflow.com/questions/3752578/safe-string-to-bigdecimal-conversion) – Kai

+0

DecimalFormat.setParseBigDecimal 함수를 사용해야하지만 그렇게 할 수는 없다고 생각합니다. GWT에서 – kroiz

답변

9

가장 쉬운 방법은 ValueBox를 상속하는 새로운 텍스트 상자 위젯을 만드는 것입니다. 이렇게하면 모든 문자열 값을 수동으로 변환 할 필요가 없습니다. ValueBox는 모든 것을 처리합니다.

BigDecimal value = myTextBox.getValue();

귀하의 BigDecimalBox.java :

public class BigDecimalBox extends ValueBox<BigDecimal> { 
    public BigDecimalBox() { 
    super(Document.get().createTextInputElement(), BigDecimalRenderer.instance(), 
     BigDecimalParser.instance()); 
    } 
} 

그런 다음 BigDecimalRenderer.java

public class BigDecimalRenderer extends AbstractRenderer<BigDecimal> { 
    private static BigDecimalRenderer INSTANCE; 

    public static Renderer<BigDecimal> instance() { 
    if (INSTANCE == null) { 
     INSTANCE = new BigDecimalRenderer(); 
    } 
    return INSTANCE; 
    } 

    protected BigDecimalRenderer() { 
    } 

    public String render(BigDecimal object) { 
    if (null == object) { 
     return ""; 
    } 

    return NumberFormat.getDecimalFormat().format(object); 
    } 
} 

는 BigDecimal의 값은 그냥 갈 수있는 입력 얻으려면 0

그리고 당신의 BigDecimalParser.java

package com.google.gwt.text.client; 

import com.google.gwt.i18n.client.NumberFormat; 
import com.google.gwt.text.shared.Parser; 

import java.text.ParseException; 

public class BigDecimalParser implements Parser<BigDecimal> { 

    private static BigDecimalParser INSTANCE; 

    public static Parser<BigDecimal> instance() { 
    if (INSTANCE == null) { 
     INSTANCE = new BigDecimalParser(); 
    } 
    return INSTANCE; 
    } 

    protected BigDecimalParser() { 
    } 

    public BigDecimal parse(CharSequence object) throws ParseException { 
    if ("".equals(object.toString())) { 
     return null; 
    } 

    try { 
     return new BigDecimal(object.toString()); 
    } catch (NumberFormatException e) { 
     throw new ParseException(e.getMessage(), 0); 
    } 
    } 
} 
+0

나는이 방법을 시도했다. 문제는'getDecimalFormat()'이 천 단위 구분 기호를 포함하는'NumberFormat'을 반환한다는 것입니다. '새로운 BigDecimal'은 수천 개의 분리자를 구문 분석하지 않습니다. '이중화'를 구문 분석하고 적절하게 반올림하지 않고 간단한 해결 방법이없는 것 같습니다. –

+0

@ Boris the Spider, 당신은 확실히 수천 개의 분리 기호를 출력하지 않는 맞춤 NumberFormat을 사용하거나 구문 분석하기 전에 문자열에서 구분 기호를 제거하거나 NumberFormat을 사용하여 BigDecimal을 구문 분석 할 수 있습니다 (.setParseBigDecimal (true)로). http://stackoverflow.com/questions/14346403/how-to-parse-a-string-number-into-a-bigdecimal – Strelok

+0

첫 번째 옵션은 'NumberFormat'의 목적을 상실합니다. - 그 시점에서 BigDecimal.toPlainString 두 번째 옵션은 모든 종류의 로케일 문제를 일으킨다. 확실히 할 수 있지만 존재하는 바퀴를 재창조하는 것처럼 보인다. 그리고 마지막 것은 좋을 것이다. 그러나 이것은 com.google.gwt.i18n.client와 같다. NumberFormat' 메소드를 가지고 있지 않습니다. 'double'을 사용하는 것이 가장 간단한 해결책처럼 보입니다. 소수점 이하 자릿수가 필요한 경우 정밀도가 충분합니다. –

1

GWT-Math을 살펴보십시오.

+0

나는 double과 BigDecimal로 변환 할 수 있음을 알았다. 괜찮을까요? 나는 그럭저럭 아무것도 잃어 버리지 않을까? – kroiz

+2

'String'에서'BigDecimal'까지 한 걸음 씩 옮길 수 있다면'double'으로 변환 할 때 그 숫자가 반올림 될 가능성을 줄이기 때문에 그렇게 할 수도 있습니다. – npinti