Shopifyで変数の値が数字か文字かを判定する(条件ありのやや変則型):メモ

窓辺

調べたところliquidにはPHPのis_numericのような機能がないらしく、数値か文字かを判定するために別の方法を調べました。

前提

  • カスタムフィールドに入力した値を出力するときに、文字か数字かを判別したい
  • カスタムフィールドに数字を入力しても、出力時には文字列として出力される

カスタムフィールドを使う都合上全て文字列になってしまうため、厳密な型判定などではありません。

対応策

上記を参考に、必要な部分だけで構築すると以下のようにすれば判定できました。


{% comment %}
 product.metafields.hoge.fuga には、カンマ区切りで以下のような値の配列が入っている前提。
 [1,22,a,aaa]
 数値のみ、アルファベットのみ、という形に限定。
{% endcomment %}
{% assign values = product.metafields.hoge.fuga | split: "," %}

{% for value in values %}
  {% assign first_letter = value | truncate: 1, '' %}
  {% if "0123456789" contains first_letter %}
    {{ value }}は数字です。
  {% else %}
    {{ value }}は数字ではありません。
  {% endif %}
{% endfor %}

containsを使った方法ですが、通常はif 変数 contains 指定文字列と書くところを、if 判別用文字列 contains 変数のように入れ替えています。

初見では頭がこんがらがってきましたが、「”0123456789″に”1″(=変数)が含まれていれば」と読み替えると納得はできました。

なお、2桁以上の数字に対応するために、truncate: 1, ''というフィルターを使っているのもポイントです。

このフィルターによって先頭の1字のみがfirst_letterに代入されるので、何桁だろうと数字のみで構成されてさえいれば判定可能です。
for文で全桁数文処理を繰り返せばより正確な判定(通常の数値判定としては必須ですが)もできるかと思います。

カスタムフィールドに関連しない場合の対応策

前提を崩し、カスタムフィールドを利用せず、数値を数値として出力できている場合には、JSONを使う方法もありました。


{% assign var1 = "1" %}
{% capture testValue %}{{ var1 | json }}{% endcapture %}
{% if testValue contains '"' %}string{% else %}number{% endif %}

jsonフィルターを通すことで、文字列はダブルクォーテーションで囲まれ、数値は囲まれないこと利用した方法です。

文字列の数字を数値に変換する

本筋とはずれますが文字列としての数字を数値に変換して、オペレーターで大小を比較できるようにする方法もあります。

文字列を数値に変換

{% assign num = num | plus: 0 %}
{% assign num = num | times: 1 %}

plusフィルターで0を加算するか、timesフィルターで1で積算することで数値に変換できる模様。

メタフィールドの値は文字列になっているらしく、数値として扱う必要がある場合は変換しなければならないので、これらの方法を使うことで値の大小が比較できるようになる。

結び

厳密な判定とは言えない方法ですが、以下をみますと2014年ごろからこの判定に関して話題にでており、かつ現在でも判定用の仕組みが導入されていないところをみると、今後も導入されない可能性が高いように思います。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄