Index: xfa/src/fgas/src/localization/fx_locale.cpp |
diff --git a/xfa/src/fgas/src/localization/fx_locale.cpp b/xfa/src/fgas/src/localization/fx_locale.cpp |
index f8b2f9d1cb1ad8cece9236a18b204c8c634c33f4..a5498945ae8a8174a70ff9efc1463f4e78e46d0d 100644 |
--- a/xfa/src/fgas/src/localization/fx_locale.cpp |
+++ b/xfa/src/fgas/src/localization/fx_locale.cpp |
@@ -278,11 +278,12 @@ static const FX_FLOAT gs_fraction_scales[] = { |
0.000000001f, 0.0000000001f, 0.00000000001f}; |
static const int32_t gs_fraction_count = |
sizeof(gs_fraction_scales) / sizeof(FX_FLOAT); |
+ |
class CFX_LCNumeric { |
public: |
CFX_LCNumeric(); |
CFX_LCNumeric(int64_t integral, |
- FX_DWORD fractional = 0, |
+ uint32_t fractional = 0, |
int32_t exponent = 0); |
CFX_LCNumeric(FX_FLOAT dbRetValue); |
CFX_LCNumeric(double dbvalue); |
@@ -292,63 +293,58 @@ class CFX_LCNumeric { |
double GetDouble() const; |
CFX_WideString ToString() const; |
CFX_WideString ToString(int32_t nTreading, FX_BOOL bTrimTailZeros) const; |
+ |
int64_t m_Integral; |
- FX_DWORD m_Fractional; |
-#ifdef FX_NUM_DOUBLE |
- CFX_WideString m_wsValue; |
-#endif |
+ uint32_t m_Fractional; |
int32_t m_Exponent; |
}; |
+ |
static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue, |
CFX_LCNumeric& lcnum) { |
- int64_t* pIntegral = &lcnum.m_Integral; |
- FX_DWORD* pFractional = &lcnum.m_Fractional; |
- int32_t* pExponent = &lcnum.m_Exponent; |
- *pIntegral = 0; |
- *pFractional = 0; |
- *pExponent = 0; |
-#ifdef FX_NUM_DOUBLE |
- lcnum.m_wsValue.Empty(); |
-#endif |
- if (wsValue.IsEmpty()) { |
+ lcnum.m_Integral = 0; |
+ lcnum.m_Fractional = 0; |
+ lcnum.m_Exponent = 0; |
+ |
+ if (wsValue.IsEmpty()) |
return FALSE; |
- } |
+ |
const int32_t nIntegralMaxLen = 17; |
int32_t cc = 0; |
- FX_BOOL bNegative = FALSE, bExpSign = FALSE; |
+ bool bNegative = false; |
+ bool bExpSign = false; |
const FX_WCHAR* str = (const FX_WCHAR*)wsValue; |
int32_t len = wsValue.GetLength(); |
- while (cc < len && FX_IsSpace(str[cc])) { |
+ while (cc < len && FX_IsSpace(str[cc])) |
cc++; |
- } |
- if (cc >= len) { |
+ |
+ if (cc >= len) |
return FALSE; |
- } |
+ |
if (str[cc] == '+') { |
cc++; |
} else if (str[cc] == '-') { |
- bNegative = TRUE; |
+ bNegative = true; |
cc++; |
} |
int32_t nIntegralLen = 0; |
while (cc < len) { |
- if (str[cc] == '.') { |
+ if (str[cc] == '.') |
break; |
- } |
+ |
if (!FX_IsDigit(str[cc])) { |
- if ((str[cc] == 'E' || str[cc] == 'e')) { |
+ if ((str[cc] == 'E' || str[cc] == 'e')) |
break; |
- } else { |
+ else |
return FALSE; |
- } |
} |
if (nIntegralLen < nIntegralMaxLen) { |
- *pIntegral = *pIntegral * 10 + str[cc] - '0'; |
+ lcnum.m_Integral = lcnum.m_Integral * 10 + str[cc] - '0'; |
nIntegralLen++; |
} |
cc++; |
} |
- *pIntegral = bNegative ? -*pIntegral : *pIntegral; |
+ |
+ lcnum.m_Integral = bNegative ? -lcnum.m_Integral : lcnum.m_Integral; |
if (cc < len && str[cc] == '.') { |
int scale = 0; |
double fraction = 0.0; |
@@ -356,24 +352,22 @@ static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue, |
while (cc < len) { |
if (scale >= gs_fraction_count) { |
while (cc < len) { |
- if (!FX_IsDigit(str[cc])) { |
+ if (!FX_IsDigit(str[cc])) |
break; |
- } |
cc++; |
} |
} |
if (!FX_IsDigit(str[cc])) { |
- if ((str[cc] == 'E' || str[cc] == 'e')) { |
+ if ((str[cc] == 'E' || str[cc] == 'e')) |
break; |
- } else { |
+ else |
return FALSE; |
- } |
} |
fraction += gs_fraction_scales[scale] * (str[cc] - '0'); |
scale++; |
cc++; |
} |
- *pFractional = (FX_DWORD)(fraction * 4294967296.0); |
+ lcnum.m_Fractional = (FX_DWORD)(fraction * 4294967296.0); |
} |
if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { |
cc++; |
@@ -381,26 +375,21 @@ static FX_BOOL FX_WStringToNumeric(const CFX_WideString& wsValue, |
if (str[cc] == '+') { |
cc++; |
} else if (str[cc] == '-') { |
- bExpSign = TRUE; |
+ bExpSign = true; |
cc++; |
} |
} |
while (cc < len) { |
- if (FX_IsDigit(str[cc])) { |
+ if (FX_IsDigit(str[cc])) |
return FALSE; |
- } |
- *pExponent = *pExponent * 10 + str[cc] - '0'; |
+ lcnum.m_Exponent = lcnum.m_Exponent * 10 + str[cc] - '0'; |
cc++; |
} |
- *pExponent = bExpSign ? -*pExponent : *pExponent; |
+ lcnum.m_Exponent = bExpSign ? -lcnum.m_Exponent : lcnum.m_Exponent; |
} |
-#ifdef FX_NUM_DOUBLE |
- else { |
- lcnum.m_wsValue = wsValue; |
- } |
-#endif |
return TRUE; |
} |
+ |
CFX_LCNumeric::CFX_LCNumeric() { |
m_Integral = 0; |
m_Fractional = 0; |
@@ -446,94 +435,13 @@ double CFX_LCNumeric::GetDouble() const { |
} |
return value; |
} |
+ |
CFX_WideString CFX_LCNumeric::ToString() const { |
return ToString(8, TRUE); |
} |
+ |
CFX_WideString CFX_LCNumeric::ToString(int32_t nTreading, |
FX_BOOL bTrimTailZeros) const { |
-#ifdef FX_NUM_DOUBLE |
- CFX_WideString wsResult; |
- if (!m_wsValue.IsEmpty()) { |
- const int32_t nIntegralMaxLen = 17; |
- int32_t cc = 0; |
- FX_BOOL bNegative = FALSE, bExpSign = FALSE; |
- const FX_WCHAR* str = (const FX_WCHAR*)m_wsValue; |
- int32_t len = m_wsValue.GetLength(); |
- while (cc < len && FX_IsSpace(str[cc])) { |
- cc++; |
- } |
- if (cc >= len) { |
- return wsResult; |
- } |
- if (str[cc] == '+') { |
- cc++; |
- } else if (str[cc] == '-') { |
- bNegative = TRUE; |
- cc++; |
- } |
- int32_t nIntegralLen = 0; |
- while (cc < len) { |
- if (str[cc] == '.') { |
- break; |
- } |
- if (!FX_IsDigit(str[cc])) { |
- if ((str[cc] == 'E' || str[cc] == 'e')) { |
- break; |
- } else { |
- return wsResult; |
- } |
- } |
- if (nIntegralLen < nIntegralMaxLen) { |
- *pIntegral = *pIntegral * 10 + str[cc] - '0'; |
- nIntegralLen++; |
- } |
- cc++; |
- } |
- *pIntegral = bNegative ? -*pIntegral : *pIntegral; |
- if (cc < len && str[cc] == '.') { |
- int scale = 0; |
- double fraction = 0.0; |
- cc++; |
- while (cc < len) { |
- if (scale >= gs_fraction_count) { |
- while (cc < len) { |
- if (!FX_IsDigit(str[cc])) { |
- break; |
- } |
- cc++; |
- } |
- } |
- if (!FX_IsDigit(str[cc])) { |
- if ((str[cc] == 'E' || str[cc] == 'e')) { |
- break; |
- } else { |
- return FALSE; |
- } |
- } |
- fraction += gs_fraction_scales[scale] * (str[cc] - '0'); |
- scale++; |
- cc++; |
- } |
- *pFractional = (FX_DWORD)(fraction * 4294967296.0); |
- } |
- } |
- double dbValeu = GetDouble(); |
- int64_t iInte = (int64_t)dbValeu; |
- wsResult.Format(L"%l", (int64_t)iInte); |
- if (m_Fractional) { |
- CFX_WideString wsFormat; |
- wsFormat.Format(L"%%.%dG", nTreading); |
- double dblMantissa = (dbValeu > 0) ? (dbValeu - iInte) : (iInte - dbValeu); |
- CFX_WideString wsFrac; |
- wsFrac.Format((const FX_WCHAR*)wsFormat, dblMantissa); |
- wsResult += |
- CFX_WideStringC((const FX_WCHAR*)wsFrac + 1, wsFrac.GetLength() - 1); |
- if (bTrimTailZeros && nTreading > 0) { |
- wsResult.TrimRight(L"0"); |
- wsResult.TrimRight(L"."); |
- } |
- } |
-#endif |
CFX_WideString wsFormat; |
wsFormat.Format(L"%%.%df", nTreading); |
CFX_WideString wsResult; |
@@ -544,6 +452,7 @@ CFX_WideString CFX_LCNumeric::ToString(int32_t nTreading, |
} |
return wsResult; |
} |
+ |
IFX_FormatString* IFX_FormatString::Create(IFX_LocaleMgr* pLocaleMgr, |
FX_BOOL bUseLCID) { |
if (!pLocaleMgr) { |