サポート » プラグイン » Advanced Custom Fieldsの数値について

  • 解決済 ioxrxogi

    (@ioxrxogi)


    Advanced Custom Fields 4.4.11

    ACFでカスタムフィールドを作っています。
    フィールドタイプの数値で、15桁以上を入力すると文字化けしてしまいます。

    例えば、
    100000000000000

    1.0E+14
    となります。

    原因と対策があればどなたか教えてください。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • CG

    (@du-bist-der-lenz)

    3かける3をどう書きますか 3の右肩に小さく2と書くでしょう。
    指数表記の Exponent で、文字化けではありません

    CGさん、ありがとうございます。

    100000000000000を100000000000000のまま表示するにはどうすればいいのでしょう?

    CG

    (@du-bist-der-lenz)

    有効桁数の制限で、想定されていないと思われます。Exponentで置き換えできるわけですから。

    こんにちは

    書式指定(sprintf, printf 等)して出力してみてはどうでしょうか。

    $n = get_field( 'フィールド名' );
    $s = sprintf( '%.0f', floatval( $n ) );
    echo $s;

    ishitakaさん、ありがとうございます。

    試してみたのですが、
    100000000000001でも100000000000000と表示されてしまいます。

    おっと、失礼しました。
    ACF の数値タイプでは 100000000000001 が入力できないようですね。
    対策はちょっと分かりませんでした。すみません。

    ioxrxogi さん

    
    echo '<pre>' ;
    var_dump( $field ) ;
    echo '</pre>' ;
    

    上記で試したところ、管理ページのフィールドの表示はおかしいですが
    DB上には、正しい数値で書き込まれているようです。

    で、

    
    $field = get_field('test');
    echo sprintf( $field ) ;
    

    とりあえずは、表示(閲覧ページ側)されたのですが、正しいかどうか、すみません、詳しい方お願いします。

    多分、「exp」が適応されてしまうのは、ワードプレスや、ACFやwpというより、PHPなどの仕様な感じがしますがどうなんですかね。
    くわしくなくて、申し訳ないです。

    もしかしたら、「.htacccess」などでなにか定義すれば、管理ページも含めて改善されるかもしれませんが、ちょっと調べきれなかったです。

    あ、ishitakaさんと同じ関数でしたね。

    ishitakaさんのソースの方が綺麗に書かれてますので、参考にされると良いと思います。

    mura0403さん、ありがとうございます。

    >管理ページのフィールドの表示はおかしいですが
    >DB上には、正しい数値で書き込まれているようです

    そうなんですよね。
    フィールドの右端の↑↓で増減させるともとの数値があるんですよね。
    指数表記にデータが置き換わっているわけではないようなので……。

    どこかにそのあたりの設定があるんでしょうか。

    ioxrxogiさん

    多分、最大値を設定することで解消できるかもしれません。
    「input type=”number”」タグの仕様なのかなと調べていったところ、最大値を設定することで改善できるようなことを言ってる人がいたので、試したところ

    わたくしの環境では改善できました。
    最大値を多めに設定してみて頂けますでしょうか。

    mura0403さん、ありがとうございます。

    設定してみたのですが、

    2147483647以上は設定できませんでした。
    (これ以上に設定しても、この数値に最大値がなってしまいます)

    あまりよくわかっていない門外漢の意見で申し訳ないのですが、数値の演算桁数問題ではないでしょうか。
    大きな桁が扱える各桁数の数値でやり取りしている各上限が指定されているものかもしくは規定のものとして
    桁を切られているのではないでしょうか。

    もしそうだとしたらそれだけの巨大な数値を数値として運用される必要があるのでしょうか。
    もしおありでしたら、上何桁から、下何桁まで、などと分けて10進数を扱うか
    もしくは16進数を使うか、または演算要素をそのまま配列などで扱うのはいかがでしょうか。
    ちなみにただの文字列として利用する数値型の巨大な値と文字型の同じ桁数の文字列だと
    数字の場合は「積層結果の量子化」と文字列の「環境定数の量子化」の差があるので
    演算に利用しないのであれば文字で扱うほうが効率もよいのではないかと思いますが
    いうべくもなく数値の用途でありましたら老婆心ご容赦いただきたく存じます。

    文字列ならば何桁でもいけると思いますがバリアンティックに変数へ代入する際に環境の規定数に
    そろえられる恐れのある数値の代入では正確性に問題がでるかもしれないのはお試し結果がそれではないかと思います。

    配列で桁数を分配して持つとか、クラスタによって接頭語を付けて数値を代入するとか、固定長で文字列として扱って
    演算の必要なときには分解して、64ビットレジスタバンドを32ビットの多重計算でみせかけるのような数値型として利用するなどはいかがでしょうか。
    進数の変換でひとまとめの10進数として表示しきれないときは、10進数にしたときの数字の状態を文字列として再描画するような方法もあると思います。

    問題解決に叶うものではないかと思いますが、何かの解決の糸口へ参考になれましたら幸いです。

    msioさん、ありがとうございます。

    わたしも詳しくないので行き当たりばったりでやっている結果がこれです……。

    最初は、5桁でやっていたのですが、運用していくうちに9桁になり、気づくと13桁になり、それでもたりなくなり15桁でと思ったのですが、うまくできませんでした。
    (14桁までは大丈夫なようです)

    違う方法も考えてみます。

    @ioxrxogi さま

    ありがとうございます。
    世にはIEEE754という規格があるとかphpの整数の扱いとかあるようなのでしっかりと理解できれば対処ができると思うのですが悩みどころです。
    機能について詳しくはわからないのですが、単純に取り扱いデータの管理を配列で統計できる対象が個数として1兆を超えるのでしょうか。
    利用する数値に間隔があいている、特定の桁数は分類を示す、なのであれば文字型で受け取りsubstrで桁を分解して数値を取得するなどできるかと思うのですがいかがでしょうか。
    数値を変数の型を定義せずに代入するとき、勝手に数値になってオーバーフローするのを防ぐために文字型と明示して渡すかセパレータを挟むなどできそうな気がします。
    実際の各個数をひとつの分類として取り扱うという用途において数字を使用する局面は、個数に関してのみなどにしぼったほうがいいような気がしています。

    msioさん、ありがとうございます。

    現状維持しながら、別の方法を探ってみます。

    他の皆さんもありがとうございます。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「Advanced Custom Fieldsの数値について」には新たに返信することはできません。