Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 26 additions & 7 deletions src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,35 @@ QString Utils::formatThousandsSeparators(const QString &str)
input = input.left(eIndex);
}

// 使用系统小数符优先定位小数点;若无则回退'.'。切分后仅清理整数部分已有分组符,小数部分保持不变
QString fractional;
bool hasDecimalPoint = false;
int dotIndex = input.indexOf('.');
if (dotIndex >= 0) {
hasDecimalPoint = true;
fractional = input.mid(dotIndex + 1);
input = input.left(dotIndex);
}

QString integerPart = input;
{
int decIdx = -1;
// 如果系统小数符不是'.',优先查找系统小数符
if (!decSym.isEmpty() && decSym != QLatin1String(".")) {
decIdx = input.lastIndexOf(decSym);
}
// 未找到系统小数符,或系统小数符就是'.',则查找'.'
if (decIdx < 0) {
decIdx = input.lastIndexOf(QLatin1Char('.'));
}
if (decIdx >= 0) {
hasDecimalPoint = true;
fractional = input.mid(decIdx + 1);
integerPart = input.left(decIdx);
}
// 仅清理整数部分中可能已存在的分组符号('.'、','、全角','、空格、系统分组符),小数部分完全保持原样
const QChar fullWidthComma(0xFF0C);
if (!grpSym.isEmpty())
integerPart.remove(grpSym);
integerPart.remove(QLatin1Char('.'));
integerPart.remove(QLatin1Char(','));
integerPart.remove(fullWidthComma);
integerPart.remove(QLatin1Char(' '));
}

QString groupedInteger = integerPart;
if (groupingEnabled && !grpSym.isEmpty() && separate > 0 && integerPart.length() > separate) {
for (int i = groupedInteger.length() - separate; i > 0; i -= separate) {
Expand Down
16 changes: 13 additions & 3 deletions src/views/memorywidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,11 +474,21 @@ void MemoryWidget::resetLabelBySeparator()

if (m_memorypublic->isEmpty())
return;
QString text;
// 从底层 Quantity 重新格式化,避免在已本地化的显示文本上操作导致小数符被误删
// 旧代码:textLabel().remove(",") 会把系统小数符(如","或",")也删除,导致"11.111,04"变成"11.11104"
for (int i = 0; i < m_listwidget->count(); i++) {
QString formatted;
if (m_calculatormode == 2) {
const QString result = programmerResult(m_memorypublic->getList().at(i));
formatted = Utils::formatThousandsSeparatorsPro(result, Settings::instance()->programmerBase);
} else {
const Quantity ans = m_memorypublic->getList().at(i);
const QString result = DMath::format(ans, Quantity::Format::General() + Quantity::Format::Precision(m_precision));
formatted = Utils::formatThousandsSeparators(result);
}
formatted = setitemwordwrap(formatted, i);
auto wgt = static_cast<MemoryItemWidget *>(m_listwidget->itemWidget(m_listwidget->item(i)));
text = Utils::formatThousandsSeparators(wgt->textLabel().remove(","));
wgt->setTextLabel(text);
wgt->setTextLabel(formatted);
}
}

Expand Down
25 changes: 20 additions & 5 deletions src/widgets/inputedit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ void InputEdit::handleTextChanged(const QString &text)
const auto sys = Settings::instance();
const QString decSym = sys->getSystemDecimalSymbol();
const QString grpSym = sys->getSystemDigitGroupingSymbol();
const QString decimalPlaceholder = QString(QChar(0x1D));
const QString decimalPlaceholder = QStringLiteral("__DEC_PLACEHOLDER__");

if (!decSym.isEmpty() && decSym != QLatin1String("."))
normalizedExpr.replace(decSym, decimalPlaceholder);
Expand Down Expand Up @@ -696,7 +696,7 @@ QString InputEdit::pointFaultTolerance(const QString &text)
{
const auto sys = Settings::instance();
QString decSym = sys->getSystemDecimalSymbol();
const QString decimalPlaceholder = QString(QChar(0x1D));
const QString decimalPlaceholder = QStringLiteral("__DEC_PLACEHOLDER__");

QString workingText = text;
if (!decSym.isEmpty() && decSym != QLatin1String("."))
Expand Down Expand Up @@ -1128,8 +1128,23 @@ QPair<bool, Quantity> InputEdit::getMemoryAnswer()
expression = symbolComplement(expressionText()).replace(QString::fromUtf8("+"), "+")
.replace(QString::fromUtf8("-"), QChar('-'))
.replace(QString::fromUtf8("×"), "*")
.replace(QString::fromUtf8("÷"), "/")
.replace(QString::fromUtf8(","), "");
.replace(QString::fromUtf8("÷"), "/");

// 正确清理表达式:使用系统小数符/分组符规范化,而非直接删除","
// 直接 .replace(",", "") 会把系统小数符(如",")误删,导致"11.111,04"变成"11.11104"
const auto sys = Settings::instance();
const QString decSym = sys->getSystemDecimalSymbol();
const QString grpSym = sys->getSystemDigitGroupingSymbol();
// 使用明确的合成字符串作为占位符,避免与用户输入或粘贴内容冲突
const QString decimalPlaceholder = QStringLiteral("__DEC_PLACEHOLDER__");

if (!decSym.isEmpty() && decSym != QLatin1String("."))
expression.replace(decSym, decimalPlaceholder);
if (!grpSym.isEmpty() && grpSym != decSym)
expression.replace(grpSym, "");
if (!decSym.isEmpty() && decSym != QLatin1String("."))
expression.replace(decimalPlaceholder, QLatin1String("."));

m_evaluator->setExpression(expression);
m_memoryans = m_evaluator->evalUpdateAns();
if (m_evaluator->error().isEmpty()) {
Expand Down Expand Up @@ -1335,7 +1350,7 @@ QString InputEdit::formatExpression(const int &probase, const QString &text)
const auto sys = Settings::instance();
const QString decSym = sys->getSystemDecimalSymbol();
const QString grpSym = sys->getSystemDigitGroupingSymbol();
const QString decimalPlaceholder = QString(QChar(0x1D));
const QString decimalPlaceholder = QStringLiteral("__DEC_PLACEHOLDER__");

if (!decSym.isEmpty() && decSym != QLatin1String("."))
formattext.replace(decSym, decimalPlaceholder);
Expand Down
Loading