0

私のアプリケーションでは、log4j が float を指数 (例: 2.2388E2) として出力することがわかりました。値を非指数として表示したい。(223.88)

ケースはお客様の環境で発生し、シミュレートできます。これはどのような状況で起こるのでしょうか?これを防ぐ方法はありますか?

追加情報 : エンベロープ ドキュメントは CXF を使用して生成されました。

以下は私のユニットケースです:

@Test      
public  void testSomething()
{

    ServiceEnvelopeDocument serviceEnvelopeDocument  =      ServiceEnvelopeDocument.Factory.newInstance();  
    ServiceEnvelope serviceEnvelope                  =      serviceEnvelopeDocument.addNewServiceEnvelope();
    ServiceBody  serviceBody                         =      serviceEnvelope.addNewServiceBody();
    RsDetail rsDetails                               =      serviceBody.addNewRsDetail();   

    float testFloat = 223.88f;

    AuxiliaryAccountStaticBalanceDetail accountStaticBalance  = rsDetails.addNewAuxiliaryAccountStaticBalanceDetail();

    accountStaticBalance.setAccountBalance(testFloat);

    logger.error(""+accountStaticBalance);
    logger.error(serviceEnvelopeDocument.toString());
    logger.error(String.valueOf(accountStaticBalance));
}` 

上記のソース コードの出力:

2013-01-02 14:55:33.443 ERROR (main) AccountInquiryUtilTest:  - <AccountBalance   xmlns="http://schemas.ocbc.com/soa/emf/account/elements">223.88</AccountBalance>
2013-01-02 14:55:33.465 ERROR (main) AccountInquiryUtilTest:  - <ServiceEnvelope xmlns="http://schemas.ocbc.com/soa/emf/common/envelope/" xmlns:cbs="http://schemas.ocbc.com/soa/emf/service/CBS-CustAccountInfo-I" xmlns:agg="http://schemas.ocbc.com/soa/emf/account/aggregates" xmlns:elem="http://schemas.ocbc.com/soa/emf/account/elements">
  <ServiceBody>
    <cbs:RsDetail>
      <agg:HolderAccountTypeDetail/>
      <agg:AuxiliaryAccountStaticBalanceDetail>
        <elem:AccountBalance>223.88</elem:AccountBalance>
      </agg:AuxiliaryAccountStaticBalanceDetail>
    </cbs:RsDetail>
  </ServiceBody>
</ServiceEnvelope>
2013-01-02 14:55:33.544 ERROR (main) AccountInquiryUtilTest:  - <AccountBalance xmlns="http://schemas.ocbc.com/soa/emf/account/elements">223.88</AccountBalance>

お客様の環境での出力:

<ns3:AccountBalance>2.2388E2</ns3:AccountBalance>
4

1 に答える 1

1

文字列のバランスを記録しているため、log4j のせいである可能性はありません。

logger.error(String.valueOf(accountStaticBalance))

現在、String.valueOf() はあまり柔軟ではないため、NumberFormat (または DecimalFormat) など、別のものを使用する必要があります。以下は、 String.valueOf (float) と同じである Float.toString()の公式ルールからの抜粋です。

  • m が 10^-3 以上で 10^7 未満の場合、m の整数部分として、先行ゼロなしの 10 進数形式で表され、その後に「.」が続きます。('\u002E') の後に、m の小数部を表す 1 つ以上の 10 進数が続きます。
  • m が 10^-3 未満または 10^7 以上の場合、いわゆる「コンピュータ科学表記法」で表されます。n を 10^n <= m < 10^n+1 となる一意の整数とします。次に、a を m と 10^n の数学的に正確な商とし、1 <= a < 10 とします。大きさは、a の整数部分として、単一の 10 進数として表され、その後に「.」が続きます。('\u002E')、その後に a の小数部を表す 10 進数、その後に文字 'E' ('\u0045') が続き、その後にメソッド Integer によって生成される 10 進整数としての n の表現が続きます。 toString(int)。

これらのルールが異なる環境で異なる結果を生成する理由がわかりません。おそらく、正しいコードを示していないのでしょう。これらのルールは、現在のロケールにも依存しません。

于 2013-01-02T07:32:52.900 に答える