調べたところ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文で全桁数文処理を繰り返せばより正確な判定(通常の数値判定としては必須ですが)もできるかと思います。
- Logical and comparison operators
containsについての記載あり - String filters
truncateについて記載あり
カスタムフィールドに関連しない場合の対応策
前提を崩し、カスタムフィールドを利用せず、数値を数値として出力できている場合には、JSONを使う方法もありました。
{% assign var1 = "1" %}
{% capture testValue %}{{ var1 | json }}{% endcapture %}
{% if testValue contains '"' %}string{% else %}number{% endif %}
jsonフィルターを通すことで、文字列はダブルクォーテーションで囲まれ、数値は囲まれないこと利用した方法です。
文字列の数字を数値に変換する
本筋とはずれますが文字列としての数字を数値に変換して、オペレーターで大小を比較できるようにする方法もあります。
- 文字列を数値に変換
-
- Shopify — Liquid, Convert string to integer | by Chris Cao | Medium
- type-conversion — Shopify Liquidで文字列を整数に変換しますか?
{% assign num = num | plus: 0 %} {% assign num = num | times: 1 %}
plusフィルターで0を加算するか、timesフィルターで1で積算することで数値に変換できる模様。
メタフィールドの値は文字列になっているらしく、数値として扱う必要がある場合は変換しなければならないので、これらの方法を使うことで値の大小が比較できるようになる。
結び
厳密な判定とは言えない方法ですが、以下をみますと2014年ごろからこの判定に関して話題にでており、かつ現在でも判定用の仕組みが導入されていないところをみると、今後も導入されない可能性が高いように思います。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。