Как преобразовать буквенно-цифровой (справочный) номер, содержащий десятичную точку, в строку в Mathematica - PullRequest
4 голосов
/ 08 апреля 2011

У меня есть ссылочный номер следующего типа DAA76647.1, который я хочу преобразовать без изменений в строку в Mathematica.

То есть

myfn [DAA76647.1]

дает в качестве вывода

"DAA76647.1"

Есть ли простой способ сделать это?(Входные данные не могут быть строкой и, кроме преобразования в строку, я не хочу изменять входные данные любым другим способом).

Обновление

ToString /@ {A1234, 1234.1, A1234 .5}

дает следующий вывод (где я просто ввел все с клавиатуры)

{"A1234", "1234.1", "0.5 A1234"}

Похоже, что если то, что идет до десятичной точки, является буквенно-цифровым, возникает проблема.

Возможный обходной путь

На основании предложенного решения David Carraher , возможный метод выглядит следующим образом:

ToString[# /.a_ b_ :> ToString[b] <> StringDrop[ToString[a], 1]] & /@ {A1234, 
  1234.1, A1234 .5}

, выдавая в качестве вывода:

{"A1234", "1234.1", "A1234.5"}

Кажется, это работает нормально, при условии, что то, что идет после десятичной запятой, не является буквенно-цифровым, и при условии, что то, что предшествует, не начинается с нуля (например, 0A123.1).

Если буквенно-цифровые символы встречаются только после десятичной точки, это может быть включено

StringReplace[ToString[123.45 B55c], Whitespace -> ""]

, но если буквенно-цифровые символы встречаются до и после десятичной точки, число по-прежнему необходимо вводить в виде строки.

оригинальное предложение Дэвида Каррахера

f[Times[a_, b_]] := ToString[b] <> ToString[a] 

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

Вызов myfn[DAA76647.1] должен быть перехвачен на этапе преобразования ввода в выражение.

Вы можете видеть, что Input имеет вид RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}]:

In[1]:= myfn[DAA76647 .1]
DownValues[InString]

Out[1]= myfn[0.1 DAA76647]

Out[2]= {HoldPattern[InString[1]] :> 
  ToString[RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}], 
   InputForm], 
 HoldPattern[InString[2]] :> 
  ToString[RowBox[{"DownValues", "[", "InString", "]"}], InputForm]}

Мы могли бы создать специальное определение для MakeExpression:

MakeExpression[RowBox[{"myfn", "[", RowBox[{"DAA76647", ".1"}], "]"}],
   f_] := MakeExpression[RowBox[{"myfn", "[", "\"DAA76647.1\"", "]"}],
   f]

Вы можете видеть, что теперь myfn[DAA76647 .1] работает как надо:

In[4]:= myfn[DAA76647 .1]//FullForm
Out[4]//FullForm= myfn["DAA76647.1"]

Этот подход можно обобщить на что-то вроде

MakeExpression[RowBox[{"myfn", "[", expr:Except[_String], "]"}], form_] := 
 With[{mexpr = StringJoin[expr /. RowBox -> List]}, Hold[myfn[mexpr]]]
myfn[expr_String] := (* what ever you want to do here *)

Обратите внимание, что часть Except[_String] на самом деле не нужна ... так как следующий код не будет ничего делать со строкой.
На данный момент код работает только с простыми примерами с одномерной структурой блоков. Если вы хотите что-то, что обрабатывает более общий ввод, вы можете добавить проверку ошибок или дополнительные правила для таких вещей, как SuperscriptBox и друзья. Или ударьте его молотком Evaluate[Alternatives @@ Symbol /@ Names["*Box"]] -> List, чтобы все объекты Box стали списками и сгладили все.

2 голосов
/ 08 апреля 2011

Я не думаю, что вы можете напрямую ввести это в скобках вызова функции, но

myfn[InputString[]] 

работаешь на тебя?

2 голосов
/ 08 апреля 2011

Если вы введете DAA76647DAA76647.1 через ячейку ввода в записной книжке Mma, Mma будет интерпретировать символы как умножение.Он даже автоматически вставляет пробел между 7 и .1 (по крайней мере, в Mma 8), когда вы вводите его.

DAA76647DAA76647 .1 // FullForm

(*Out= Times[0.1`,DAA76647DAA76647] *)

Это выглядит многообещающе:

f[Times[a_, b_]] := ToString[b] <> ToString[a]

РЕДАКТИРОВАТЬ : Однако, как заметил TomD (а я почему-то пропустил), он добавляет дополнительный ноль к решению!

f[Times[DAA76647DAA76647 .1]]
(*Out= DAA76647DAA766470.1  *)

%//FullForm
"DAA76647DAA766470.1"

Позже TomD показал, как это можно сделать с помощью StringDrop ping the zero.

Это исправленное решение будет работать, если справа от десятичной точки отображаются только цифры и если левая часть не интерпретируется как произведение.

Если вы попытаетесь ввести DAA76647.01A Mma проанализирует его как

(*Out= Times[".01",A,DAA76647]    *)

Обратите внимание, что он меняет порядок компонентов.

Я не могу найти способсправиться с этим переупорядочением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...