diff options
Diffstat (limited to 'sc/source/core/tool/interpr1.cxx')
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 81 |
1 files changed, 67 insertions, 14 deletions
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 30aa0b8aa13e..35c63f52a92b 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -7097,22 +7097,75 @@ void ScInterpreter::ScText() if ( MustHaveParamCount( GetByte(), 2 ) ) { String sFormatString = GetString(); - double fVal = GetDouble(); String aStr; - Color* pColor = NULL; - LanguageType eCellLang; - const ScPatternAttr* pPattern = pDok->GetPattern( - aPos.Col(), aPos.Row(), aPos.Tab() ); - if ( pPattern ) - eCellLang = ((const SvxLanguageItem&) - pPattern->GetItem( ATTR_LANGUAGE_FORMAT )).GetValue(); - else - eCellLang = ScGlobal::eLnge; - if ( !pFormatter->GetPreviewStringGuess( sFormatString, fVal, aStr, - &pColor, eCellLang ) ) - PushIllegalArgument(); + bool bString = false; + double fVal = 0.0; + switch (GetStackType()) + { + case svError: + PopError(); + break; + case svDouble: + fVal = PopDouble(); + break; + case svString: + aStr = PopString(); + bString = true; + break; + default: + { + FormulaTokenRef xTok( PopToken()); + if (!nGlobalError) + { + PushTempToken( xTok); + // Temporarily override the ConvertStringToValue() + // error for GetCellValue() / GetCellValueOrZero() + USHORT nSErr = mnStringNoValueError; + mnStringNoValueError = errNotNumericString; + fVal = GetDouble(); + mnStringNoValueError = nSErr; + if (nGlobalError == errNotNumericString) + { + // Not numeric. + nGlobalError = 0; + PushTempToken( xTok); + aStr = GetString(); + bString = true; + } + } + } + } + if (nGlobalError) + PushError( nGlobalError); else - PushString(aStr); + { + String aResult; + Color* pColor = NULL; + LanguageType eCellLang; + const ScPatternAttr* pPattern = pDok->GetPattern( + aPos.Col(), aPos.Row(), aPos.Tab() ); + if ( pPattern ) + eCellLang = ((const SvxLanguageItem&) + pPattern->GetItem( ATTR_LANGUAGE_FORMAT )).GetValue(); + else + eCellLang = ScGlobal::eLnge; + if (bString) + { + if (!pFormatter->GetPreviewString( sFormatString, aStr, + aResult, &pColor, eCellLang)) + PushIllegalArgument(); + else + PushString( aResult); + } + else + { + if (!pFormatter->GetPreviewStringGuess( sFormatString, fVal, + aResult, &pColor, eCellLang)) + PushIllegalArgument(); + else + PushString( aResult); + } + } } } |