haiku/headers/private/shared/ExpressionParser.h
Dale Cieslak d39b5bfd0c DeskCalc: make input Locale-aware
Accepts input with separators based on user's Locale.  For example,
with a European locale, "1.234,56" is valid input. With a US locale,
"1,234.56" is accepted.  The grouping separator is ignored and
removed, and the decimal separator is kept.

Supports multi-byte decimal separator and grouping separators.

The keypad localization is based on the user's Language setting,
but the separators come from the Formatting. Thus if the Language
is set to English, but the Formatting is set to, for example,
German, the keypad will show '.', but when pressed it will emit
',' to match the number Formatting. Otherwise the keypad breaks
the localized formatting.

Fixes #8503

Change-Id: I0d112bdca67a4e4898e37062102343194ed47f8f
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4965
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
2022-04-25 20:57:20 +00:00

79 lines
1.5 KiB
C++

/*
* Copyright 2006-2009 Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Stephan Aßmus <superstippi@gmx.de>
* John Scipione <jscipione@gmail.com>
* Ingo Weinhold <bonefish@cs.tu-berlin.de>
*/
#ifndef EXPRESSION_PARSER_H
#define EXPRESSION_PARSER_H
#include <String.h>
class ParseException {
public:
ParseException(const char* message, int32 position)
: message(message),
position(position)
{
}
ParseException(const ParseException& other)
: message(other.message),
position(other.position)
{
}
BString message;
int32 position;
};
struct Function;
class MAPM;
class ExpressionParser {
public:
ExpressionParser();
~ExpressionParser();
bool DegreeMode();
void SetDegreeMode(bool degrees);
void SetSupportHexInput(bool enabled);
BString Evaluate(const char* expressionString);
int64 EvaluateToInt64(const char* expressionString);
double EvaluateToDouble(const char* expressionString);
status_t SetSeparators(BString decimal, BString group);
private:
struct Token;
class Tokenizer;
private:
MAPM _ParseBinary();
MAPM _ParseSum();
MAPM _ParseProduct();
MAPM _ParsePower();
MAPM _ParseUnary();
void _InitArguments(MAPM values[],
int32 argumentCount);
MAPM _ParseFunction(const Token& token);
MAPM _ParseAtom();
MAPM _ParseFactorial(MAPM value);
void _EatToken(int32 type);
Tokenizer* fTokenizer;
bool fDegreeMode;
};
#endif // EXPRESSION_PARSER_H