fix price seperation
This commit is contained in:
parent
b406f1d7c4
commit
65cc48769d
1 changed files with 144 additions and 0 deletions
144
static/assets/js/number-formatter.js
Normal file
144
static/assets/js/number-formatter.js
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
/**
|
||||||
|
* Number Formatter Utility
|
||||||
|
* Formats numbers with comma separators for better readability
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Format number with comma separators (e.g., 1234567 -> 1,234,567)
|
||||||
|
function formatNumber(num) {
|
||||||
|
if (!num) return '';
|
||||||
|
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove comma separators from formatted number
|
||||||
|
function unformatNumber(str) {
|
||||||
|
if (!str) return '';
|
||||||
|
return str.replace(/,/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract only digits from any string
|
||||||
|
function extractDigits(str) {
|
||||||
|
if (!str) return '';
|
||||||
|
return str.replace(/\D/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize number formatting for specified input selectors
|
||||||
|
function initNumberFormatting(selectors) {
|
||||||
|
if (typeof $ === 'undefined') {
|
||||||
|
console.warn('jQuery not found. Number formatting requires jQuery.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
selectors.forEach(function(selector) {
|
||||||
|
// Store cursor position to maintain it after formatting
|
||||||
|
function setCursorPosition(input, pos) {
|
||||||
|
if (input.setSelectionRange) {
|
||||||
|
input.setSelectionRange(pos, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(selector).on('input', function(e) {
|
||||||
|
let input = $(this);
|
||||||
|
let inputElement = this;
|
||||||
|
let value = input.val();
|
||||||
|
let cursorPos = inputElement.selectionStart;
|
||||||
|
|
||||||
|
// Extract only digits
|
||||||
|
let digitsOnly = extractDigits(value);
|
||||||
|
|
||||||
|
// Store raw value
|
||||||
|
input.attr('data-raw-value', digitsOnly);
|
||||||
|
|
||||||
|
// Format and set the value
|
||||||
|
let formattedValue = formatNumber(digitsOnly);
|
||||||
|
input.val(formattedValue);
|
||||||
|
|
||||||
|
// Adjust cursor position
|
||||||
|
let oldLength = value.length;
|
||||||
|
let newLength = formattedValue.length;
|
||||||
|
let newCursorPos = cursorPos + (newLength - oldLength);
|
||||||
|
|
||||||
|
// Make sure cursor position is valid
|
||||||
|
if (newCursorPos < 0) newCursorPos = 0;
|
||||||
|
if (newCursorPos > newLength) newCursorPos = newLength;
|
||||||
|
|
||||||
|
// Set cursor position after a short delay
|
||||||
|
setTimeout(function() {
|
||||||
|
setCursorPosition(inputElement, newCursorPos);
|
||||||
|
}, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle paste events
|
||||||
|
$(selector).on('paste', function(e) {
|
||||||
|
let input = $(this);
|
||||||
|
setTimeout(function() {
|
||||||
|
let value = input.val();
|
||||||
|
let digitsOnly = extractDigits(value);
|
||||||
|
input.attr('data-raw-value', digitsOnly);
|
||||||
|
input.val(formatNumber(digitsOnly));
|
||||||
|
}, 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Before form submission, replace formatted values with raw values
|
||||||
|
$('form').on('submit', function() {
|
||||||
|
selectors.forEach(function(selector) {
|
||||||
|
let input = $(selector);
|
||||||
|
let rawValue = input.attr('data-raw-value');
|
||||||
|
if (rawValue) {
|
||||||
|
input.val(rawValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to get raw value from formatted input
|
||||||
|
function getRawValue(input) {
|
||||||
|
return $(input).attr('data-raw-value') || unformatNumber($(input).val());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to set raw value before AJAX submission
|
||||||
|
function setRawValuesForSubmission(selectors) {
|
||||||
|
selectors.forEach(function(selector) {
|
||||||
|
let input = $(selector);
|
||||||
|
let rawValue = input.attr('data-raw-value');
|
||||||
|
if (rawValue) {
|
||||||
|
input.val(rawValue);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to restore formatted values after AJAX submission
|
||||||
|
function restoreFormattedValues(selectors) {
|
||||||
|
selectors.forEach(function(selector) {
|
||||||
|
let input = $(selector);
|
||||||
|
let rawValue = input.attr('data-raw-value');
|
||||||
|
if (rawValue) {
|
||||||
|
input.val(formatNumber(rawValue));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auto-initialize for common amount input selectors
|
||||||
|
$(document).ready(function() {
|
||||||
|
const commonSelectors = [
|
||||||
|
'#id_amount',
|
||||||
|
'#id_charge_amount',
|
||||||
|
'input[name="amount"]',
|
||||||
|
'input[name="unit_price"]',
|
||||||
|
'input[name="price"]'
|
||||||
|
];
|
||||||
|
|
||||||
|
initNumberFormatting(commonSelectors);
|
||||||
|
|
||||||
|
// Make helper functions globally available for AJAX forms
|
||||||
|
window.formatNumber = formatNumber;
|
||||||
|
window.unformatNumber = unformatNumber;
|
||||||
|
window.getRawValue = getRawValue;
|
||||||
|
// Avoid name collision causing recursion by aliasing helpers
|
||||||
|
const __nf_setRawValuesForSubmission = setRawValuesForSubmission;
|
||||||
|
const __nf_restoreFormattedValues = restoreFormattedValues;
|
||||||
|
window.setRawValuesForSubmission = function() { __nf_setRawValuesForSubmission(commonSelectors); };
|
||||||
|
window.restoreFormattedValues = function() { __nf_restoreFormattedValues(commonSelectors); };
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue