Challanges representing hexadecimal values as "integer double" in uitable

10 ビュー (過去 30 日間)
Tord Fjordheim Onstein
Tord Fjordheim Onstein 2021 年 9 月 10 日
In a uitable, I’m editing multiple cells and I want to use hexadecimal (integer) as the input value. For most cases this turns out perfectly fine. However, hexadecimal values ending with 'e' are causing me a headache. It seems that Matlab interprets the input as string and converts the hexadecimal input (0xXXXX, without quotation marks) using ‘str2double’ before any callbacks are triggered. ‘str2double’ uses ‘sscanf’ behind the scenes and in ‘str2double’, ‘sscanf’ is called with format specifier ‘%f’. This makes sense when ‘str2double’ tries to convert to a double value. When ‘sscanf’ is called with ‘%f’, it probably triggers on the trailing ‘e’ for scientific notation. There is no value proceeding ‘e’ and ‘str2double’ fails to read the entire char-array and returns NaN.
I am able to catch the NaN-value and re-evaluate the string using ‘myStr2double’, where I call ‘sscanf’ with format specifier ‘%i’. This works, but it seems like an unnecessary step as not doing this works for all hexadecimal values (I’ve tested) except for those ending with ‘e’.
Here are some sample code to illustrate the problem:
str2double('0x1234')
returns 4660 (as expected)
str2double('0x123e')
returns NaN.
Is there a better solution to this behaviour, or am I trying to do something that is just outside of the intention?
In ‘myStr2double’, i call:
[a,count,errmsg,nextindex] = sscanf(s,'%i',1)
to read the entire hexadecimal char-array.
  3 件のコメント
Stephen23
Stephen23 2021 年 12 月 18 日
編集済み: Stephen23 2021 年 12 月 18 日
"...am I trying to do something that is just outside of the intention?"
Yes. STR2DOUBLE is not documenented to convert hexadecimal numbers. For reliable conversion use functions which are designed and documented for converting hexadecimal, e.g. HEX2DEC, SSCANF.
Tord Fjordheim Onstein
Tord Fjordheim Onstein 2021 年 12 月 20 日
Thank you for the input, Stephen. I just want to clarify. STR2DOUBLE is the default callback for cell-edits in a uitable, so what I am doing wrong is expecting everything to work fine using a uitable to enter numerical values by their hexadecimal representation. This might not allways be the case. Sometimes I want to enter the data as numerical integers. HEX2DEC expects text input. Matlab interprets 0x1234 (not ''0x1234') as an unsigned integer of appropriate size and thus SSCANF (with integer formatspecifier) does the job of juggeling numeric and hexadecimal integers. I handle this by setting a custom 'CellEditCallback' for my table.

サインインしてコメントする。

回答 (1 件)

Voss
Voss 2021 年 12 月 18 日
Maybe using hex2dec instead of str2double will work:
str2double('0x1234')
ans = 4660
str2double('0x123e')
ans = NaN
hex2dec('0x1234')
ans = 4660
hex2dec('0x123e')
ans = 4670
  4 件のコメント
Walter Roberson
Walter Roberson 2021 年 12 月 20 日
preprocess to determine which conversion to apply.
Tord Fjordheim Onstein
Tord Fjordheim Onstein 2021 年 12 月 20 日
Ahh, my last comment is also not correct. As the original post is a few months old, my comments was out of memory and not the actual implementation. Edits in the cells are interpreted as text (char array) , making HEX2DEC a viable option if I do the correct preprocessing of the text. However, SSCANF already handles this distinction.
From the documentation of SSCANF for format specifier %i:
The values determine the base:
  • The default is base 10.
  • If the initial digits are 0x or 0X, then the values are base 16 (hexadecimal).
  • If the initial digit is 0, then values are base 8 (octal).
Given the time, I will add a new answear and close this question later this week, though probably not on friday :-)

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeData Type Conversion についてさらに検索

製品


リリース

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by