diff --git a/core/fxcrt/css/cfx_cssdeclaration.cpp b/core/fxcrt/css/cfx_cssdeclaration.cpp
index 53b0d84..6bdbf4b 100644
--- a/core/fxcrt/css/cfx_cssdeclaration.cpp
+++ b/core/fxcrt/css/cfx_cssdeclaration.cpp
@@ -37,13 +37,13 @@
   DCHECK(pszValue);
   DCHECK_GT(iValueLen, 0);
 
-  int32_t iUsedLen = 0;
-  *pValue = FXSYS_wcstof(pszValue, iValueLen, &iUsedLen);
-  if (iUsedLen <= 0 || !isfinite(*pValue))
+  size_t nUsedLen = 0;
+  *pValue = FXSYS_wcstof(pszValue, iValueLen, &nUsedLen);
+  if (nUsedLen == 0 || !isfinite(*pValue))
     return false;
 
-  iValueLen -= iUsedLen;
-  pszValue += iUsedLen;
+  iValueLen -= nUsedLen;
+  pszValue += nUsedLen;
   *pOutUnit = CFX_CSSNumberValue::Unit::kNumber;
   if (iValueLen >= 1 && *pszValue == '%') {
     *pOutUnit = CFX_CSSNumberValue::Unit::kPercent;
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp
index 53186fa..6b0b537 100644
--- a/core/fxcrt/fx_extension.cpp
+++ b/core/fxcrt/fx_extension.cpp
@@ -28,39 +28,36 @@
 
 }  // namespace
 
-float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen) {
+float FXSYS_wcstof(const wchar_t* pwsStr, size_t nLength, size_t* pUsedLen) {
   DCHECK(pwsStr);
-
-  if (iLength < 0)
-    iLength = static_cast<int32_t>(wcslen(pwsStr));
-  if (iLength == 0)
+  if (nLength == 0)
     return 0.0f;
 
-  int32_t iUsedLen = 0;
+  size_t nUsedLen = 0;
   bool bNegtive = false;
-  switch (pwsStr[iUsedLen]) {
+  switch (pwsStr[nUsedLen]) {
     case '-':
       bNegtive = true;
       FALLTHROUGH;
     case '+':
-      iUsedLen++;
+      nUsedLen++;
       break;
   }
 
   float fValue = 0.0f;
-  while (iUsedLen < iLength) {
-    wchar_t wch = pwsStr[iUsedLen];
+  while (nUsedLen < nLength) {
+    wchar_t wch = pwsStr[nUsedLen];
     if (!FXSYS_IsDecimalDigit(wch))
       break;
 
     fValue = fValue * 10.0f + (wch - L'0');
-    iUsedLen++;
+    nUsedLen++;
   }
 
-  if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
+  if (nUsedLen < nLength && pwsStr[nUsedLen] == L'.') {
     float fPrecise = 0.1f;
-    while (++iUsedLen < iLength) {
-      wchar_t wch = pwsStr[iUsedLen];
+    while (++nUsedLen < nLength) {
+      wchar_t wch = pwsStr[nUsedLen];
       if (!FXSYS_IsDecimalDigit(wch))
         break;
 
@@ -69,20 +66,20 @@
     }
   }
 
-  if (iUsedLen < iLength &&
-      (pwsStr[iUsedLen] == 'e' || pwsStr[iUsedLen] == 'E')) {
-    ++iUsedLen;
+  if (nUsedLen < nLength &&
+      (pwsStr[nUsedLen] == 'e' || pwsStr[nUsedLen] == 'E')) {
+    ++nUsedLen;
 
     bool negative_exponent = false;
-    if (iUsedLen < iLength &&
-        (pwsStr[iUsedLen] == '-' || pwsStr[iUsedLen] == '+')) {
-      negative_exponent = pwsStr[iUsedLen] == '-';
-      ++iUsedLen;
+    if (nUsedLen < nLength &&
+        (pwsStr[nUsedLen] == '-' || pwsStr[nUsedLen] == '+')) {
+      negative_exponent = pwsStr[nUsedLen] == '-';
+      ++nUsedLen;
     }
 
     int32_t exp_value = 0;
-    while (iUsedLen < iLength) {
-      wchar_t wch = pwsStr[iUsedLen];
+    while (nUsedLen < nLength) {
+      wchar_t wch = pwsStr[nUsedLen];
       if (!FXSYS_IsDecimalDigit(wch))
         break;
 
@@ -97,7 +94,7 @@
         return 0.0f;
       }
 
-      ++iUsedLen;
+      ++nUsedLen;
     }
 
     for (size_t i = exp_value; i > 0; --i) {
@@ -111,7 +108,7 @@
   }
 
   if (pUsedLen)
-    *pUsedLen = iUsedLen;
+    *pUsedLen = nUsedLen;
 
   return bNegtive ? -fValue : fValue;
 }
diff --git a/core/fxcrt/fx_extension.h b/core/fxcrt/fx_extension.h
index 3cb5226..7319e5c 100644
--- a/core/fxcrt/fx_extension.h
+++ b/core/fxcrt/fx_extension.h
@@ -22,7 +22,7 @@
 
 #define FX_IsOdd(a) ((a)&1)
 
-float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen);
+float FXSYS_wcstof(const wchar_t* pwsStr, size_t nLength, size_t* pUsedLen);
 wchar_t* FXSYS_wcsncpy(wchar_t* dstStr, const wchar_t* srcStr, size_t count);
 int32_t FXSYS_wcsnicmp(const wchar_t* s1, const wchar_t* s2, size_t count);
 
diff --git a/core/fxcrt/fx_extension_unittest.cpp b/core/fxcrt/fx_extension_unittest.cpp
index 090c76b..70837fe 100644
--- a/core/fxcrt/fx_extension_unittest.cpp
+++ b/core/fxcrt/fx_extension_unittest.cpp
@@ -129,40 +129,40 @@
 }
 
 TEST(fxcrt, FXSYS_wcstof) {
-  int32_t used_len = 0;
+  size_t used_len = 0;
   EXPECT_FLOAT_EQ(-12.0f, FXSYS_wcstof(L"-12", 3, &used_len));
-  EXPECT_EQ(3, used_len);
+  EXPECT_EQ(3u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(1.5362f, FXSYS_wcstof(L"1.5362", 6, &used_len));
-  EXPECT_EQ(6, used_len);
+  EXPECT_EQ(6u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(0.875f, FXSYS_wcstof(L"0.875", 5, &used_len));
-  EXPECT_EQ(5, used_len);
+  EXPECT_EQ(5u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(5.56e-2f, FXSYS_wcstof(L"5.56e-2", 7, &used_len));
-  EXPECT_EQ(7, used_len);
+  EXPECT_EQ(7u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(1.234e10f, FXSYS_wcstof(L"1.234E10", 8, &used_len));
-  EXPECT_EQ(8, used_len);
+  EXPECT_EQ(8u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"1.234E100000000000000", 21, &used_len));
-  EXPECT_EQ(0, used_len);
+  EXPECT_EQ(0u, used_len);
 
   used_len = 0;
   EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"1.234E-128", 21, &used_len));
-  EXPECT_EQ(0, used_len);
+  EXPECT_EQ(0u, used_len);
 
   // TODO(dsinclair): This should round as per IEEE 64-bit values.
   // EXPECT_EQ(L"123456789.01234567", FXSYS_wcstof(L"123456789.012345678"));
   used_len = 0;
   EXPECT_FLOAT_EQ(123456789.012345678f,
                   FXSYS_wcstof(L"123456789.012345678", 19, &used_len));
-  EXPECT_EQ(19, used_len);
+  EXPECT_EQ(19u, used_len);
 
   // TODO(dsinclair): This is spec'd as rounding when > 16 significant digits
   // prior to the exponent.
@@ -170,7 +170,7 @@
   used_len = 0;
   EXPECT_FLOAT_EQ(99999999999999999.0f,
                   FXSYS_wcstof(L"99999999999999999", 17, &used_len));
-  EXPECT_EQ(17, used_len);
+  EXPECT_EQ(17u, used_len);
 
   // For https://crbug.com/pdfium/1217
   EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"e76", 3, nullptr));
@@ -181,14 +181,14 @@
       L"88888888888888888888888888888888888888888888888888888888888888888888888"
       L"88888888888888888888888888888888888888888888888888888888888",
       130, &used_len)));
-  EXPECT_EQ(130, used_len);
+  EXPECT_EQ(130u, used_len);
 
   used_len = 0;
   EXPECT_TRUE(isinf(FXSYS_wcstof(
       L"-8888888888888888888888888888888888888888888888888888888888888888888888"
       L"888888888888888888888888888888888888888888888888888888888888",
       131, &used_len)));
-  EXPECT_EQ(131, used_len);
+  EXPECT_EQ(131u, used_len);
 }
 
 TEST(fxcrt, FXSYS_SafeOps) {
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
index b6eb7ea..65698a7 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -306,7 +306,7 @@
 
 CXFA_FMLexer::Token CXFA_FMLexer::AdvanceForNumber() {
   // This will set end to the character after the end of the number.
-  int32_t used_length = 0;
+  size_t used_length = 0;
   if (m_nCursor < m_spInput.size()) {
     FXSYS_wcstof(&m_spInput[m_nCursor], m_spInput.size() - m_nCursor,
                  &used_length);
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index c188ef3..3da98f8 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -42,13 +42,13 @@
   if (wsMeasure[0] == L'=')
     wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - 1);
 
-  int32_t iUsedLen = 0;
+  size_t nUsedLen = 0;
   float fValue = FXSYS_wcstof(wsMeasure.unterminated_c_str(),
-                              wsMeasure.GetLength(), &iUsedLen);
+                              wsMeasure.GetLength(), &nUsedLen);
   if (!isfinite(fValue))
     fValue = 0.0f;
 
-  wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - iUsedLen);
+  wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - nUsedLen);
   Set(fValue, GetUnitFromString(wsMeasure));
 }
 
