/** * 公開サイト — 賃料・金額・面積・敷金礼金の表示(四捨五入しない) * list.js / search.js / detail.js と PHP rssg_pd_* / rssg_blc_* と同一方針。 */ (function (root, factory) { if (typeof module === 'object' && module.exports) { module.exports = factory(); } else { root.PropertyDisplayFormat = factory(); } })(typeof globalThis !== 'undefined' ? globalThis : this, function () { 'use strict'; /** 保存値 → 整数円(1.95 → 19500, 19500 → 19500)。表示用の丸めはしない */ function normalizeRentYen(rawRent) { if (rawRent === null || rawRent === undefined || rawRent === '') return 0; var str = String(rawRent).trim().replace(/[,,]/g, ''); if (/^\d+(\.\d+)?$/.test(str)) { var parts = str.split('.'); var whole = parseInt(parts[0], 10); if (!Number.isFinite(whole) || whole <= 0) return 0; var n = Number(str); if (!Number.isFinite(n) || n <= 0) return 0; while (n >= 100000000) n = n / 10000; if (n >= 1000) return Math.trunc(n); if (str.indexOf('.') >= 0 && n < 1000) { var frac = (parts[1] || '').replace(/\D/g, '').padEnd(4, '0').slice(0, 4); return whole * 10000 + (parseInt(frac, 10) || 0); } if (n % 1 !== 0) return Math.trunc(n * 10000); if (n >= 1 && n < 1000) return Math.trunc(n * 10000); return 0; } var n = Number(rawRent); if (!Number.isFinite(n) || n <= 0) return 0; while (n >= 100000000) n = n / 10000; if (n >= 1000) return Math.trunc(n); if (n % 1 !== 0) return Math.trunc(n * 10000); if (n >= 1 && n < 1000) return Math.trunc(n * 10000); return 0; } /** 整数円 → 万円/円(19500 → 1.95万円, 9500 → 9,500円) */ function formatYenDisplayFromIntegerYen(yen) { var n = Math.trunc(yen); if (!Number.isFinite(n) || n <= 0) return ''; if (n < 10000) return n.toLocaleString('ja-JP') + '円'; var whole = Math.trunc(n / 10000); var frac = n % 10000; if (frac === 0) return whole + '万円'; var fracStr = String(frac).padStart(4, '0').replace(/0+$/, ''); return whole + '.' + fracStr + '万円'; } function formatRentManYen(rawRent) { var yen = normalizeRentYen(rawRent); if (yen <= 0) return '要確認'; return formatYenDisplayFromIntegerYen(yen); } function formatRentManYenFromNorm(yenNorm) { if (!Number.isFinite(yenNorm) || yenNorm <= 0) return '要確認'; return formatYenDisplayFromIntegerYen(yenNorm); } function formatRentCommaYenFromNorm(yenNorm) { if (!Number.isFinite(yenNorm) || yenNorm <= 0) return '—'; return formatYenDisplayFromIntegerYen(yenNorm); } /** 管理費・共益費(整数円 → 9,500円) */ function formatMgmtFeeYenDisplay(raw) { if (raw === null || raw === undefined || raw === '') return ''; var s = String(raw).trim(); if (!s) return ''; if (/^(?:なし|無し|無|ナシ|0|0|0円)$/u.test(s.replace(/\s+/g, ''))) return '0円'; var yen = normalizeRentYen(raw); if (yen > 0) return yen.toLocaleString('ja-JP') + '円'; if (/^\d+(\.\d+)?$/.test(s.replace(/[,,]/g, ''))) { var n = Number(s.replace(/[,,]/g, '')); if (Number.isFinite(n) && n > 0) return Math.trunc(n).toLocaleString('ja-JP') + '円'; } return s; } /** 小数末尾ゼロ除去(表示用。丸めは toFixed の桁指定のみ) */ function trimDecimalString(n, maxDec) { var d = typeof maxDec === 'number' ? maxDec : 6; if (!Number.isFinite(n)) return ''; return n.toFixed(d).replace(/\.?0+$/, ''); } /** 金額(円)÷ 賃料 → Nヶ月(1.5ヶ月等を丸めない) */ function formatMonthsFromYenAmount(amountYen, rentYen) { var a = Number(amountYen); var r = Number(rentYen); if (!Number.isFinite(a) || a <= 0) return '—'; if (!Number.isFinite(r) || r <= 0) return Math.trunc(a).toLocaleString('ja-JP') + '円'; return trimDecimalString(a / r, 6) + 'ヶ月'; } function normalizeMonthLabelString(value) { if (value === null || value === undefined || value === '') return '0ヶ月'; if (typeof value === 'object') { var raw = value.raw != null ? value.raw : ''; var lbl = value.label != null ? value.label : ''; var txt = value.text != null ? value.text : ''; var val = value.value != null ? value.value : ''; if (raw !== null && raw !== undefined && String(raw).trim() !== '') return normalizeMonthLabelString(raw); if (val !== null && val !== undefined && String(val).trim() !== '') return normalizeMonthLabelString(val); if (lbl !== null && lbl !== undefined && String(lbl).trim() !== '') return normalizeMonthLabelString(lbl); if (txt !== null && txt !== undefined && String(txt).trim() !== '') return normalizeMonthLabelString(txt); return '0ヶ月'; } var s = String(value).replace(/[ \s]+/g, '').trim(); if (!s || s === '0' || s === '0円') return '0ヶ月'; if (/^(?:なし|無し|無|不要|ゼロ|ナシ)$/i.test(s)) return '0ヶ月'; s = s.replace(/ヵ月/g, 'ヶ月').replace(/ケ月/g, 'ヶ月'); if (s.indexOf('ヶ月') >= 0) return s; if (s.indexOf('か月') >= 0) return s.replace(/か月/g, 'ヶ月'); if (s.indexOf('月') >= 0 && s.indexOf('円') < 0) return s; if (/^\d+(\.\d+)?$/.test(s)) return s + 'ヶ月'; return s; } /** 一覧・検索:敷金・礼金(0 / なし → 0ヶ月、小数ヶ月は丸めない) */ function formatDepositKeyListDisplay(value, rentYenNorm) { if (value === null || value === undefined || value === '') return '0ヶ月'; if (typeof value === 'object') { var rawO = value.raw; var lblO = value.label; var txtO = value.text; var valO = value.value; if (rawO !== null && rawO !== undefined && String(rawO).trim() !== '') return formatDepositKeyListDisplay(rawO, rentYenNorm); if (valO !== null && valO !== undefined && String(valO).trim() !== '') return formatDepositKeyListDisplay(valO, rentYenNorm); if (lblO !== null && lblO !== undefined && String(lblO).trim() !== '') return formatDepositKeyListDisplay(lblO, rentYenNorm); if (txtO !== null && txtO !== undefined && String(txtO).trim() !== '') return formatDepositKeyListDisplay(txtO, rentYenNorm); return '0ヶ月'; } if (typeof value === 'number') { if (!Number.isFinite(value) || value <= 0) return '0ヶ月'; var rN = Number(rentYenNorm); if (Number.isFinite(rN) && rN > 0 && value >= 1000) { var out = formatMonthsFromYenAmount(value, rN); return out === '—' ? '0ヶ月' : out; } if (value < 100) return trimDecimalString(value, 6) + 'ヶ月'; return formatMonthsFromYenAmount(value, rN === '—' ? 0 : rN); } var s = String(value).replace(/[ \s]+/g, '').trim(); if (!s || s === '0' || s === '0円') return '0ヶ月'; if (/^(?:なし|無し|無|不要|ゼロ|ナシ)$/i.test(s)) return '0ヶ月'; if (/円|万/.test(s)) { var cleaned = s.replace(/[,,]/g, '').replace(/円/g, '').trim(); var numFromWan = cleaned.match(/(\d+(?:\.\d+)?)\s*万/); var numPlain = cleaned.match(/(\d+(?:\.\d+)?)/); var yenNum = NaN; if (numFromWan) yenNum = Number(numFromWan[1]) * 10000; else if (numPlain) yenNum = Number(numPlain[1]); var r3 = Number(rentYenNorm); if (Number.isFinite(yenNum) && yenNum > 0 && Number.isFinite(r3) && r3 > 0) { var o2 = formatMonthsFromYenAmount(yenNum, r3); return o2 === '—' ? '0ヶ月' : o2; } if (Number.isFinite(yenNum) && yenNum > 0) return Math.trunc(yenNum).toLocaleString('ja-JP') + '円'; } if (/ヶ月|ヵ月|ケ月|か月/.test(s) || (s.indexOf('月') >= 0 && s.indexOf('円') < 0)) return normalizeMonthLabelString(value); if (/^\d+(\.\d+)?$/.test(s)) { var num = Number(s); if (!Number.isFinite(num) || num <= 0) return '0ヶ月'; var r2 = Number(rentYenNorm); if (Number.isFinite(r2) && r2 > 0 && num >= 1000) { var o3 = formatMonthsFromYenAmount(num, r2); return o3 === '—' ? '0ヶ月' : o3; } return normalizeMonthLabelString(value); } return normalizeMonthLabelString(value); } /** 物件詳細:空・なし・0 → 0ヶ月 */ function formatDepositKeyDetailDisplay(amountRaw, rentYen) { var s = String(amountRaw == null ? '' : amountRaw).trim(); var compact = s.replace(/\s+/g, ''); if (!compact || /^(?:なし|無し|無|ナシ|0|0)$/u.test(compact)) return '0ヶ月'; if (/^\d+(?:\.\d+)?\s*(?:ヶ月|ケ月|か月|カ月|箇月|ヵ月)分?$/u.test(s)) { var m = s.match(/^(\d+(?:\.\d+)?)/); if (m && (m[1] === '0' || m[1] === '0.0')) return '0ヶ月'; return s.replace(/分$/u, ''); } var n = Number(amountRaw); if (Number.isFinite(n)) { var out = formatDepositKeyListDisplay(n, normalizeRentYen(rentYen)); return out; } return formatDepositKeyListDisplay(amountRaw, normalizeRentYen(rentYen)); } function formatAreaSqm(rawArea) { if (rawArea === undefined || rawArea === null || rawArea === '') return ''; var n0 = Number(rawArea); var n; if (Number.isFinite(n0)) { n = n0; } else { var s = String(rawArea) .replace(/[,,]/g, '') .replace(/㎡|m²|m2|平米/gi, '') .trim(); var m = s.match(/(\d+(?:\.\d+)?)/); n = m ? Number(m[1]) : NaN; } if (!Number.isFinite(n)) return ''; return trimDecimalString(n, 4) + '㎡'; } return { normalizeRentYen: normalizeRentYen, formatYenDisplayFromIntegerYen: formatYenDisplayFromIntegerYen, formatRentManYen: formatRentManYen, formatRentManYenFromNorm: formatRentManYenFromNorm, formatRentCommaYenFromNorm: formatRentCommaYenFromNorm, formatMgmtFeeYenDisplay: formatMgmtFeeYenDisplay, formatMonthsFromYenAmount: formatMonthsFromYenAmount, formatDepositKeyListDisplay: formatDepositKeyListDisplay, formatDepositKeyDetailDisplay: formatDepositKeyDetailDisplay, formatAreaSqm: formatAreaSqm, trimDecimalString: trimDecimalString, normalizeMonthLabelString: normalizeMonthLabelString, }; });