У меня есть простая функция: {=B2*C2 \# "-#.##0,00"}
в таблице в Word. Однако это дает результат как 2.345,67
, так как я живу в Нидерландах. Теперь мне нужно поделиться этим документом с английскими коллегами и хочу, чтобы форматирование таких формул (у меня их много) отображалось как 2,345.67
, т. е. британская или американская локаль. Я могу сделать это с помощью {=B2*C2 \# "-#.##0,00"}
, но тогда мне нужно будет поддерживать две версии документа и обновлять каждое поле.
Я предпочитаю иметь возможность устанавливать локаль централизованным способом, но установка локали для документа или через инструменты проверки не помогает, иэто предложение, т.е. использование локали, например, \l 2057
для английского языка, приводит к синтаксической ошибке.
Я могу четко изменить форматирование строки вручную, хотя я предпочитаю использовать настройку языка. Это не относится к полям, которые считываются: если я изменю поле на B2
использование точек для десятичных знаков вместо запятых, оно не сможет правильно рассчитать.
Смена локали всего компьютера помогла, но это не долгосрочное решение.
решение1
В этой области существует ряд проблем, и ни одну из них нелегко решить.
В некотором смысле, основная проблема заключается не в том, что вы на самом деле описываете, то есть в том, что форматирование не работает, а в том, что когда пользователь вводит число в таблицу, оно «фиксируется», то есть после того, как вы ввели
1234,56
в Word нет абсолютно надежного механизма, чтобы изменить это на
1234.56
и Word распознает число по-разному в зависимости от того, установлен ли на панели управления Windows символ десятичной точки как «.» или «,».
Если вы создаете документ без таких значений (только пустые ячейки)ивы собираетесь отправить «форму» пользователю из США/Великобритании, который введет значенияиТолько после этого он будет использоваться пользователями из Великобритании и США, есть несколько вещей, которые вы можете сделать.
В противном случае, насколько мне известно, вам либо придется заставлять людей вводить данные очень неестественным образом, либо вам придется делать это сразу после того, как пользователь введет 1234.56, либо вам придется упростить преобразование всех чисел в формат другой культуры. В самом простом случае вы можете использовать подстановочный знак поиска/замены, чтобы заменить что-то вроде
([0-9]),([0-9])
к
\1.\2
(или наоборот), предполагая, что это не изменит ничего другого, что выглядит как числа. И вам, вероятно, придется обернуть это в макрос VBA.
Что касается переключателей форматирования, единственный действительно надежный способ справиться с этим — не использовать их и полностью положиться на то, как Word форматирует числа по умолчанию. (Кстати, иногда люди добавляют заполнители «#» в числовые форматы Word, потому что раньше они работали в Excel и не осознавали, что они им просто не нужны).
Однако, если вам нужно использовать числовые форматы, то вам нужно будет ввести в формат правильные символы "десятичной точки" и "разделителя тысяч". Под этим я подразумеваю те же символы, которые используются в панели управления Windows на машине, где редактируется документ.
Не существует полностью надежного встроенного способа сделать это с помощью полей. Вы можете использовать VBA, чтобы получить соответствующие символы из Windows. В качестве альтернативы вы можете попробовать "подделать это", используя некоторые вложенные поля в соответствии со следующими строками:
{ IF 1/2 = 0,5 "{ SET POINT "," }{ SET GROUP "." }" "{ SET POINT "." }{ SET GROUP "," }" }
(помните, чтовсе{ } должны быть специальными парами фигурных скобок кода поля, которые можно вставить с помощью Ctrl-F9 в Word для настольных компьютеров Windows)
тогда, вместо того, чтобы
{=B2*C2 \# "-#.##0,00"}
ты используешь
{=B2*C2 \# "-#{ GROUP }##0{ POINT }00"}
В качестве альтернативы вы можете определить свои форматы в начале документа, например:
{ SET FORMAT1 "-#{ GROUP }##0{ POINT }00" }
затем используйте
{=B2*C2 \# "{ FORMAT1 }"}
Очевидно, что такой подход не будет работать с произвольной локалью (например, некоторые локали используют неразрывный пробел в качестве разделителя тысяч) или необычными настройками в панели управления, но его может быть достаточно для NL/US/UK.
К сожалению, это "легкая" проблема для решения. Если вы на самом деле хотите исправить все так, чтобы все ваши пользователи (NL/UK/US) входили и видели одинаковое форматирование, независимо от их настроек Windows, то это на самом деле гораздо более сложная проблема для решения. Предположим, вы решили, что все должны входить и видеть формат США, например1,234,567.89
Проблема в том, что Word не распознает "1234.56" правильно в системе с типичными настройками NL. Единственное, что вы могли бы сделать (ИМХО), чтобы справиться с этим, это...
а. избегайте ввода данных пользователем или ограничивайте ввод пользователями только целочисленных данных
б. временно изменить соответствующие настройки Windows в системе пользователя, возможно, с помощью VBA, если это не исключается ограничениями безопасности.
Я не уверен, что стоит вообще пытаться предложить решение для любого из этих вариантов.
Однако, возможно, стоит перечислить некоторые моменты, которые необходимо учитывать при универсальном решении этой проблемы, а именно:
Основная проблема заключается в том, что форматирование чисел в Word в основном зависит от настроек в параметрах Windows/панели управления. Фактически реализация Word настолько стара, что учитывает только некоторые из этих настроек. Например, она будет группировать цифры в группы по три независимо от того, что вы установили в панели управления. Как вы уже обнаружили, вы не можете влиять на отображение чисел с помощью переключателя локали, например,
\l 2057
или применяя язык проверки (который на самом деле работает в определенной степени с датами. Даже если бы вы могли применить язык проверки, вам все равно пришлось бы разобраться, как его изменить.Версии Word для настольных компьютеров и онлайн ведут себя по-разному. Насколько мне известно, на данный момент веб-версия Word оставляет результаты в полях такими, какие они есть, независимо от настроек локали. Конечно, со временем это может измениться, и версии Word для «устройств» могут вести себя по-разному. Версия для Mac Desktop ведет себя почти так же, как и версия для Windows, но для изменения настроек Mac потребуется другой код, нежели в версии для Windows.
Проблема не только в «формате». Есть также проблема «как вы печатаете свои числа» и проблема «распознавания».
В строке числового формата нет соглашения, которое позволяло бы вампереопределитьзначения в панели управления Windows или даже указать, что вы хотите использовать значение, указанное в панели управления Windows.
Что я имею в видупереопределитьчто вы не можете сделать что-то вроде
{ DECIMAL "." }{ =10000/3 \# "###0<decimal>00" }
так что Слово будетвсегдаиспользуйте «.» в качестве десятичной точки, независимо от настроек Windows.
Под «использовать значение, указанное в панели управления Windows» я подразумеваю следующее: когда вы вводите такой формат, как
#,##0.00
то если «,» на самом деле является символом десятичной точки в настройках Windows, вся строка формата не может вести себя так, как вы надеетесь.
вы, вероятно, действительно хотите использовать что-то вроде
#<thousands>##0<decimal>00
где Word фактически берет значение и из Панели управления Windows.
За исключением использования VBA, в Word нет ничего, что позволило бы вам надежно узнать текущие значения символа разделителя тысяч, символа десятичной точки (или строки символов валюты).
(возможно, это не имеет значения в вашем случае, но для полноты картины стоит упомянуть) Если вы используете метаданные SharePoint для вставки числовых значений через элементы управления содержимым, вам в конечном итоге придется работать с соглашением «.» для десятичных точек, поскольку именно это соглашение использует XML, и Word не поможет вам преодолеть его.
В строках числового формата «символ разделителя тысяч» не является позиционным. Например, в соглашениях США/Великобритании форматирование
1000000
с помощью\#",0"
дает вам1,000,000
, а не100000,0
Если вам также нужно ввести/отформатировать данные о валюте, применяются дополнительные настройки. Если у вас есть документ с данными в двух или более валютах, вам придется смириться с тем, что Word распознает только одну из них как валюту.
Word получает значение еще одного специального символа из панели управления Windows — символа разделителя списка. Обычно это либо ",", либо ";". Если у вас есть формулы, которые используют функции с параметрами, вам необходимо использовать правильный разделитель. (Вам также может потребоваться использовать правильный разделитель в других типах полей, таких как TOC и EQ).
Попытка обнаружить или оценить значения трех переменных символов (десятичная точка, разделитель групп цифр, разделитель списков) с использованием кодирования полей, как я подозреваю, в общем случае практически невозможна. Даже подход, который я предложил выше, может привести к синтаксической ошибке, особенно если вы делаете слияние, когда Word может пометить синтаксическую ошибку, которая не вызывает проблем в обычном документе.