表示する時に書式を調整する。
ユーザーごとに閲覧制限を設定できるようになったが、まだまだ改善したい項目が多い。まず気になるのが、表示する時の書式。現状では文字列も数値も全て左寄せ、データベースに保存されたデータをそのまま表示しているだけだ。会社決算の資料を閲覧するために活用するなら、最低限、数値は右寄せして、3桁ごとに桁区切りをしたい。
ところが、CSVファイルには書式情報は含まれていない。それでは書式設定のためのレコードを1行追加しようとも考えたが、ユーザーの立場で考えれば、それは面倒だ。CSVファイルをアップロードするために行うファイル修正は、最小限に留めたい。出来れば無修正のままアップロードできるのがベスト。そこで、データの形式からサーバー側で判断して、表示書式を一定のルールで勝手に決めてしまうことにした。
書式判定のルール
-
- 数字または+-\.,%だけで構成されるデータは数値と見なし、右寄せにする。
- 数値は3桁ごとにカンマで区切る。但し、%が含まれている場合は桁区切りはしない。
- 数値以外は全て文字列として扱い、左寄せにする。
- 先頭と末尾の'または"は表示しない。(例:'123 や "456"は文字列と見なされ、表示上は数値と同じだが左寄せになる。)
コードの修正
上記のようなルールで、早速、修正してみた。
<%#---------- app/views/displays/_display.rhtml ----------%> <% # The following is used when the browser doesn't have javascript enabled %> <% classAttr = cycle("", "class=\"even\"") %> <% @options = params.merge(:controller => '/displays', :action => "view", :id => display.send("#{Display.primary_key}")) %> <tr <%= classAttr %> id="<%= element_row_id(@options) %>" <%= "style=\"display: none;\"" if hidden %>> <% for scaffold_column in scaffold_columns %> <% column_value = eval(scaffold_column.eval) rescue nil %> <%# 以下1行追記:数値または+-\.,%であれば、右寄せにする。 %> <% position = /^[\d+-\\\.,%]+$/ =~ column_value ? 'right' : 'left' %> <%# 以下1行追記:数値または+-\.,であれば、カンマ区切りで表示する。例:-1,234,567,890 %> <% column_value = column_value.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, '\1,') if /^[\d+-\\\.,]+$/ =~ column_value %> <%# 右寄せにする。 align="<%= position %>" を追記 %> <td class="<%= column_class(scaffold_column.name, column_value, current_sort(params), scaffold_column.class_name) %>" align="<%= position %>" > <%# 先頭または末尾の"と'は表示しない。column_value.gsub(/^["']|["']$/, '') を追記 %> <%= format_column(column_value.gsub(/^["']|["']$/, '') , scaffold_column.sanitize?)%> </td> <% end %> <td class="actions"> ...(以下省略)...
正規表現でデータの書式を判定しているが、それがかなり強力だ。もしRubyで正規表現が使えなかったら、かなり面倒な作業になってしまいそうだ。まだ、あまりよく分かっていないが、使いこなせれば、かなり高度な判定処理が出来そうだ。
修正後の表示はこんな感じ。組織列の分類コードは、'100 のように記入している。(100 のままだと右寄せになってしまうので...。)
書式設定の自由度は低いけど、まあまあ満足。