Index: fpdfsdk/javascript/PublicMethods.cpp |
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp |
index 0173bb3ff5b7b4a56badf5190d58cc22b7c034c7..bfe48d5b65a9906b6b54356bdd38d79be8c32112 100644 |
--- a/fpdfsdk/javascript/PublicMethods.cpp |
+++ b/fpdfsdk/javascript/PublicMethods.cpp |
@@ -7,6 +7,9 @@ |
#include "fpdfsdk/javascript/PublicMethods.h" |
#include <algorithm> |
+#include <iomanip> |
+#include <sstream> |
+#include <string> |
#include <vector> |
#include "core/fpdfdoc/cpdf_interform.h" |
@@ -84,6 +87,24 @@ void AlertIfPossible(CJS_Context* pContext, const FX_WCHAR* swMsg) { |
pFormFillEnv->JS_appAlert(swMsg, nullptr, 0, 3); |
} |
+#if _FX_OS_ != _FX_ANDROID_ |
+CFX_ByteString CalculateString(double dValue, |
+ int iDec, |
+ int* iDec2, |
+ bool* bNegative) { |
+ *bNegative = dValue < 0; |
+ if (*bNegative) |
+ dValue = -dValue; |
+ std::stringstream ss; |
+ ss << std::fixed << std::setprecision(iDec) << dValue; |
+ std::string stringValue = ss.str(); |
+ size_t iDecimalPos = stringValue.find("."); |
+ *iDec2 = iDecimalPos == std::string::npos ? stringValue.size() |
+ : static_cast<int>(iDecimalPos); |
+ return CFX_ByteString(stringValue.c_str()); |
+} |
+#endif |
+ |
} // namespace |
bool CJS_PublicMethods::IsNumber(const CFX_WideString& str) { |
@@ -760,66 +781,45 @@ bool CJS_PublicMethods::AFNumber_Format(IJS_Context* cc, |
if (iNegStyle < 0 || iNegStyle > 3) |
iNegStyle = 0; |
- // for processing decimal places |
+ // Processing decimal places |
strValue.Replace(",", "."); |
double dValue = atof(strValue.c_str()); |
if (iDec > 0) |
dValue += DOUBLE_CORRECT; |
+ // Calculating number string |
+ bool bNegative; |
int iDec2; |
- int iNegative = 0; |
- |
- strValue = fcvt(dValue, iDec, &iDec2, &iNegative); |
+ strValue = CalculateString(dValue, iDec, &iDec2, &bNegative); |
if (strValue.IsEmpty()) { |
dValue = 0; |
- strValue = fcvt(dValue, iDec, &iDec2, &iNegative); |
+ strValue = CalculateString(dValue, iDec, &iDec2, &bNegative); |
if (strValue.IsEmpty()) { |
strValue = "0"; |
iDec2 = 1; |
} |
} |
- if (iDec2 < 0) { |
- for (int iNum = 0; iNum < abs(iDec2); iNum++) { |
- strValue = "0" + strValue; |
- } |
- iDec2 = 0; |
- } |
- int iMax = strValue.GetLength(); |
- if (iDec2 > iMax) { |
- for (int iNum = 0; iNum <= iDec2 - iMax; iNum++) { |
- strValue += "0"; |
- } |
- iMax = iDec2 + 1; |
- } |
- |
- // for processing seperator style |
- if (iDec2 < iMax) { |
- if (iSepStyle == 0 || iSepStyle == 1) { |
- strValue.Insert(iDec2, '.'); |
- iMax++; |
- } else if (iSepStyle == 2 || iSepStyle == 3) { |
- strValue.Insert(iDec2, ','); |
- iMax++; |
- } |
+ // Processing separator style |
+ if (iDec2 < strValue.GetLength()) { |
+ if (iSepStyle == 2 || iSepStyle == 3) |
+ strValue.Replace(".", ","); |
if (iDec2 == 0) |
strValue.Insert(iDec2, '0'); |
} |
if (iSepStyle == 0 || iSepStyle == 2) { |
- char cSeperator; |
+ char cSeparator; |
if (iSepStyle == 0) |
- cSeperator = ','; |
+ cSeparator = ','; |
else |
- cSeperator = '.'; |
+ cSeparator = '.'; |
- for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) { |
- strValue.Insert(iDecPositive, cSeperator); |
- iMax++; |
- } |
+ for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) |
+ strValue.Insert(iDecPositive, cSeparator); |
} |
- // for processing currency string |
+ // Processing currency string |
Value = CFX_WideString::FromLocal(strValue.AsStringC()); |
if (bCurrencyPrepend) |
@@ -827,13 +827,12 @@ bool CJS_PublicMethods::AFNumber_Format(IJS_Context* cc, |
else |
Value = Value + wstrCurrency; |
- // for processing negative style |
- if (iNegative) { |
- if (iNegStyle == 0) { |
+ // Processing negative style |
+ if (bNegative) { |
+ if (iNegStyle == 0) |
Value = L"-" + Value; |
- } else if (iNegStyle == 2 || iNegStyle == 3) { |
+ else if (iNegStyle == 2 || iNegStyle == 3) |
Value = L"(" + Value + L")"; |
- } |
if (iNegStyle == 1 || iNegStyle == 3) { |
if (Field* fTarget = pEvent->Target_Field()) { |
CJS_Array arColor; |