mirror of
https://github.com/Microsoft/calculator.git
synced 2025-08-24 06:55:19 -07:00
add exponential without sign support
This commit is contained in:
parent
67fa2286eb
commit
3654ccd95b
3 changed files with 45 additions and 30 deletions
|
@ -45,7 +45,7 @@ static const array<wregex, 1> standardModePatterns =
|
||||||
static const array<wregex, 2> scientificModePatterns =
|
static const array<wregex, 2> scientificModePatterns =
|
||||||
{
|
{
|
||||||
wregex(c_wspcLParens + c_signedDecFloat + c_wspcRParens),
|
wregex(c_wspcLParens + c_signedDecFloat + c_wspcRParens),
|
||||||
wregex(c_wspcLParens + c_signedDecFloat + L"[e]([+]|[-])+\\d+" + c_wspcRParens)
|
wregex(c_wspcLParens + c_signedDecFloat + L"e[+-]?\\d+" + c_wspcRParens)
|
||||||
};
|
};
|
||||||
static const array<array<wregex, 5>, 4> programmerModePatterns =
|
static const array<array<wregex, 5>, 4> programmerModePatterns =
|
||||||
{ {
|
{ {
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace CalculatorApp::ViewModel
|
||||||
StringReference IsInError(L"IsInError");
|
StringReference IsInError(L"IsInError");
|
||||||
StringReference BinaryDisplayValue(L"BinaryDisplayValue");
|
StringReference BinaryDisplayValue(L"BinaryDisplayValue");
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CalculatorResourceKeys
|
namespace CalculatorResourceKeys
|
||||||
{
|
{
|
||||||
StringReference CalculatorExpression(L"Format_CalculatorExpression");
|
StringReference CalculatorExpression(L"Format_CalculatorExpression");
|
||||||
|
@ -504,7 +504,7 @@ void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
|
||||||
{
|
{
|
||||||
if (commandIndex == 0)
|
if (commandIndex == 0)
|
||||||
{
|
{
|
||||||
delete [] temp;
|
delete[] temp;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,7 +572,7 @@ void StandardCalculatorViewModel::OnButtonPressed(Object^ parameter)
|
||||||
if (IsInError)
|
if (IsInError)
|
||||||
{
|
{
|
||||||
m_standardCalculatorManager.SendCommand(Command::CommandCLEAR);
|
m_standardCalculatorManager.SendCommand(Command::CommandCLEAR);
|
||||||
|
|
||||||
if (!IsRecoverableCommand((int)numOpEnum))
|
if (!IsRecoverableCommand((int)numOpEnum))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -855,14 +855,25 @@ void StandardCalculatorViewModel::OnPaste(String^ pastedString, ViewMode mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle exponent and exponent sign (...e+... or ...e-...)
|
// Handle exponent and exponent sign (...e+... or ...e-... or ...e...)
|
||||||
if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
|
if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
|
||||||
{
|
{
|
||||||
++it;
|
//Check the following item
|
||||||
if (!(MapCharacterToButtonId(*it, canSendNegate) == NumbersAndOperatorsEnum::Add))
|
switch (MapCharacterToButtonId(*(it + 1), canSendNegate))
|
||||||
|
{
|
||||||
|
case NumbersAndOperatorsEnum::Subtract:
|
||||||
{
|
{
|
||||||
Command cmdNegate = ConvertToOperatorsEnum(NumbersAndOperatorsEnum::Negate);
|
Command cmdNegate = ConvertToOperatorsEnum(NumbersAndOperatorsEnum::Negate);
|
||||||
m_standardCalculatorManager.SendCommand(cmdNegate);
|
m_standardCalculatorManager.SendCommand(cmdNegate);
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NumbersAndOperatorsEnum::Add:
|
||||||
|
{
|
||||||
|
//Nothing to do, skip to the next item
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1396,29 +1407,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
|
||||||
|
|
||||||
switch (nOpCode)
|
switch (nOpCode)
|
||||||
{
|
{
|
||||||
case static_cast<int>(Command::CommandASIN) :
|
case static_cast<int>(Command::CommandASIN) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandACOS) :
|
case static_cast<int>(Command::CommandACOS) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandATAN) :
|
case static_cast<int>(Command::CommandATAN) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandASINH) :
|
case static_cast<int>(Command::CommandASINH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandACOSH) :
|
case static_cast<int>(Command::CommandACOSH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandATANH) :
|
case static_cast<int>(Command::CommandATANH) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
|
||||||
break;
|
break;
|
||||||
case static_cast<int>(Command::CommandPOWE) :
|
case static_cast<int>(Command::CommandPOWE) :
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
|
||||||
}
|
}
|
||||||
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
|
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
|
||||||
{
|
{
|
||||||
|
|
|
@ -147,6 +147,10 @@ namespace CalculatorUnitTests
|
||||||
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"1e23" }, ViewMode::Standard, CategoryGroupType::Calculator, -1, -1));
|
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"1e23" }, ViewMode::Standard, CategoryGroupType::Calculator, -1, -1));
|
||||||
|
|
||||||
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"1.23e+456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"1.23e+456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
||||||
|
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123e-456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
||||||
|
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123e -456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
||||||
|
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"12323e456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
||||||
|
VERIFY_IS_TRUE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"12323 e 456" }, ViewMode::Scientific, CategoryGroupType::Calculator, -1, -1), L"Verify operand only needs to match one pattern.");
|
||||||
|
|
||||||
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"12345678901234567" }, ViewMode::Standard, CategoryGroupType::Calculator, -1, -1), L"Verify all operands must be within maxlength");
|
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"12345678901234567" }, ViewMode::Standard, CategoryGroupType::Calculator, -1, -1), L"Verify all operands must be within maxlength");
|
||||||
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"9223372036854775808" }, ViewMode::Programmer, CategoryGroupType::Calculator, DecBase, QwordType), L"Verify all operand must be within max value.");
|
VERIFY_IS_FALSE(m_CopyPasteManager.ExpressionRegExMatch(vector<wstring>{ L"123", L"9223372036854775808" }, ViewMode::Programmer, CategoryGroupType::Calculator, DecBase, QwordType), L"Verify all operand must be within max value.");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue