callResultType numberToString_func(parameterType param, sptrObject& obj){ if (param.size() > 2){ std::ostringstream os; os << "number->string. need 1 or 2, given " << param.size(); return std::make_pair(Interp::EVAL_PARAMETER_NUMBER_MISMATCH, os.str()); } int default_radix = 10; if (param.size() == 2){ if (! static_cast<ObjectDef::Number*>(param[1].get())->getExactness()){ return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, "number->string. Position 1, need exact integer, given inexact integer"); } if (ObjectDef::equal(param[1], getTen())){ default_radix = 10; } else if (ObjectDef::equal(param[1], getSixteen())){ default_radix = 16; } else if (ObjectDef::equal(param[1], getEight())){ default_radix = 8; } else if (ObjectDef::equal(param[1], getTwo())){ default_radix = 2; } else { std::ostringstream os; os << "number->string. Position, need 2, 8, 10 or 16, given" << param[1]->getExternalRep(); return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, os.str()); } } if (default_radix != 10){ if (param[0]->getType() == ObjectDef::ObjectType::COMPLEX){ if (static_cast<ObjectDef::Complex*>(param[0].get())->getReal()->getType() == ObjectDef::ObjectType::REAL || static_cast<ObjectDef::Complex*>(param[0].get())->getImag()->getType() == ObjectDef::ObjectType::REAL){ return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, "number->string. base has to be 10 to convert a complex containing real part"); } } if (param[0]->getType() == ObjectDef::ObjectType::REAL){ return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, "number->string. base has to be 10 to convert a real"); } } obj = sptrObject(new ObjectDef::String(numberToString_impl(param[0], default_radix), true, false)); return std::make_pair(Interp::EVAL_NO_ERROR, ""); }
callResultType stringToNumber_func(parameterType param, sptrObject& obj){ if (param.size() > 2){ std::ostringstream os; os << "string->number. need 1 or 2, given " << param.size(); return std::make_pair(Interp::EVAL_PARAMETER_NUMBER_MISMATCH, os.str()); } int default_radix = 10; if (param.size() == 2){ if (! static_cast<ObjectDef::Number*>(param[1].get())->getExactness()){ return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, "string->number. Position 1, need exact integer, given inexact integer"); } if (ObjectDef::equal(param[1], getTen())){ default_radix = 10; } else if (ObjectDef::equal(param[1], getSixteen())){ default_radix = 16; } else if (ObjectDef::equal(param[1], getEight())){ default_radix = 8; } else if (ObjectDef::equal(param[1], getTwo())){ default_radix = 2; } else { std::ostringstream os; os << "string->number. Position, need 2, 8, 10 or 16, given" << param[1]->getExternalRep(); return std::make_pair(Interp::EVAL_CONTRACTION_VIOLATION, os.str()); } } int ret = ParserEnv::Parser::parseNumber(obj, static_cast<ObjectDef::String*>(param[0].get())->getInterpretedString(), default_radix); if (ret != ParserEnv::PARSE_NORMAL_EXIT){ return std::make_pair(Interp::EVAL_INVALID_NUMBER, static_cast<ObjectDef::String*>(param[0].get())->getInterpretedString()); } return std::make_pair(Interp::EVAL_NO_ERROR, ""); }
string getHundred(int num) { string HUNDRED = "C", FIVEHUNDRED = "D", THOUSAND = "M", result = ""; if (num >= 900) { result = HUNDRED + THOUSAND; } else if ( num < 900 && num >= 500) { result = FIVEHUNDRED; while (num >= 600) { result += HUNDRED; num -= 100; } } else if (num >= 400) { result = HUNDRED + FIVEHUNDRED; } else if (num >= 100) { while (num >= 100) { result += HUNDRED; num -= 100; } } return result + getTen(num % 100); }