diff --git a/src/xercesc/util/XMLBigDecimal.cpp b/src/xercesc/util/XMLBigDecimal.cpp
index b998f6d159aa6ad53b359218ad9523de346753d9..ecac4ca05e194619e96c49f8890dae04bb5f393f 100644
--- a/src/xercesc/util/XMLBigDecimal.cpp
+++ b/src/xercesc/util/XMLBigDecimal.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.23  2004/08/11 16:17:58  peiyongz
+ * Light weight parsing method
+ *
  * Revision 1.22  2004/03/19 01:15:55  peiyongz
  * store/load fRawData
  *
@@ -420,6 +423,74 @@ void  XMLBigDecimal::parseDecimal(const XMLCh* const toParse
     return;
 }
 
+void  XMLBigDecimal::parseDecimal(const XMLCh*         const toParse
+                               ,        MemoryManager* const manager)
+{
+
+    // Strip leading white space, if any. 
+    const XMLCh* startPtr = toParse;
+    while (XMLChar1_0::isWhitespace(*startPtr))
+        startPtr++;
+
+    // If we hit the end, then return failure
+    if (!*startPtr)
+        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_WSString, manager);
+
+    // Strip tailing white space, if any.
+    const XMLCh* endPtr = toParse + XMLString::stringLen(toParse);
+    while (XMLChar1_0::isWhitespace(*(endPtr - 1)))
+        endPtr--;
+
+    // '+' or '-' is allowed only at the first position
+    // and is NOT included in the return parsed string
+
+    if (*startPtr == chDash)
+    {
+        startPtr++;
+    }
+    else if (*startPtr == chPlus)
+    {
+        startPtr++;
+    }
+
+    // Strip leading zeros
+    while (*startPtr == chDigit_0)
+        startPtr++;
+
+    // containning zero, only zero, nothing but zero
+    // it is a zero, indeed
+    if (startPtr >= endPtr)
+    {
+        return;
+    }
+
+    // Scan data
+    bool   dotSignFound = false;
+    while (startPtr < endPtr)
+    {
+        if (*startPtr == chPeriod)
+        {
+            if (!dotSignFound)
+            {
+                dotSignFound = true;
+                startPtr++;
+                continue;
+            }
+            else  // '.' is allowed only once
+                ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_2ManyDecPoint, manager);
+        }
+
+        // If not valid decimal digit, then an error
+        if ((*startPtr < chDigit_0) || (*startPtr > chDigit_9))
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+
+        startPtr++;
+
+    }
+
+    return;
+}
+
 int XMLBigDecimal::compareValues( const XMLBigDecimal* const lValue
                                 , const XMLBigDecimal* const rValue
                                 , MemoryManager* const manager)
diff --git a/src/xercesc/util/XMLBigDecimal.hpp b/src/xercesc/util/XMLBigDecimal.hpp
index 33a8e8612983d47cc56060bc6317d328c69de688..57085c22dd041b296409009c8a32b96925bd14b4 100644
--- a/src/xercesc/util/XMLBigDecimal.hpp
+++ b/src/xercesc/util/XMLBigDecimal.hpp
@@ -111,6 +111,12 @@ public:
                 ,        MemoryManager* const manager
                 );
 
+    static void  parseDecimal
+                ( 
+                   const XMLCh*         const toParse
+                ,        MemoryManager* const manager
+                );
+
     /**
      *
      *  Deprecated: please use getRawData
@@ -130,6 +136,8 @@ public:
 
     unsigned int          getTotalDigit() const;
 
+    inline XMLCh*         getIntVal() const;
+
     /**
      * Compares this object to the specified object.
      *
@@ -196,6 +204,7 @@ private:
     XMLCh*         fRawData;
     XMLCh*         fIntVal;
     MemoryManager* fMemoryManager;
+
 };
 
 inline int XMLBigDecimal::getSign() const
@@ -233,6 +242,11 @@ inline MemoryManager* XMLBigDecimal::getMemoryManager() const
     return fMemoryManager;
 }
 
+inline XMLCh*  XMLBigDecimal::getIntVal() const
+{
+    return fIntVal;
+}
+
 //
 // The caller needs to de-allocate the memory allocated by this function
 //